Skip to content

Commit 2ea948d

Browse files
KhArtNJavaenhorse
authored andcommitted
Update sql.md
1 parent a07ab5c commit 2ea948d

1 file changed

Lines changed: 163 additions & 0 deletions

File tree

sql.md

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,14 +333,176 @@ __Курсор__ — это объект базы данных, который
333333
## Расскажите об основных функциях ранжирования в Transact-SQL.
334334
Ранжирующие функции - это функции, которые возвращают значение для каждой записи группы в результирующем наборе данных. На практике они могут быть использованы, например, для простой нумерации списка, составления рейтинга или постраничной навигации.
335335

336+
К примеру, у нас имеется набор данных следующего вида:
337+
338+
![ ](images/SQL/image.png)
339+
336340
`ROW_NUMBER` – функция нумерации в Transact-SQL, которая возвращает просто номер записи.
337341

342+
Например, запрос
343+
```sql
344+
SELECT Studentname,
345+
Subject,
346+
Marks,
347+
ROW_NUMBER() OVER(ORDER BY Marks) RowNumber
348+
FROM ExamResult;
349+
```
350+
Вернёт набор данных следующего вида:
351+
352+
![ ](images/SQL/row_number-sql-rank-function.png)
353+
354+
А запрос вида
355+
```sql
356+
SELECT Studentname,
357+
Subject,
358+
Marks,
359+
ROW_NUMBER() OVER(ORDER BY Marks desc) RowNumber
360+
FROM ExamResult;
361+
```
362+
363+
Вернёт набор
364+
365+
![ ](images/SQL/row_number-example.png)
366+
367+
338368
`RANK` возвращает ранг каждой записи. В данном случае, в отличие от `ROW_NUMBER`, идет уже анализ значений и в случае нахождения одинаковых возвращает одинаковый ранг с пропуском следующего.
339369

370+
Например:
371+
372+
```sql
373+
SELECT Studentname,
374+
Subject,
375+
Marks,
376+
RANK() OVER(PARTITION BY Studentname ORDER BY Marks DESC) Rank
377+
FROM ExamResult
378+
ORDER BY Studentname,
379+
Rank;
380+
```
381+
382+
Результат:
383+
384+
![ ](images/SQL/ranksql-rank-function.png)
385+
386+
Ещё пример:
387+
388+
```sql
389+
SELECT Studentname,
390+
Subject,
391+
Marks,
392+
RANK() OVER(ORDER BY Marks DESC) Rank
393+
FROM ExamResult
394+
ORDER BY Rank;
395+
```
396+
397+
Результат:
398+
399+
![ ](images/SQL/output-of-rank-function-for-similar-values.png)
400+
401+
340402
`DENSE_RANK` так же возвращает ранг каждой записи, но в отличие от `RANK` в случае нахождения одинаковых значений возвращает ранг без пропуска следующего.
341403

404+
Например:
405+
406+
```sql
407+
SELECT Studentname,
408+
Subject,
409+
Marks,
410+
DENSE_RANK() OVER(ORDER BY Marks DESC) Rank
411+
FROM ExamResult
412+
ORDER BY Rank;
413+
```
414+
415+
Результат:
416+
417+
![ ](images/SQL/dense_ranksql-rank-function.png)
418+
419+
Ещё пример:
420+
421+
```sql
422+
SELECT Studentname,
423+
Subject,
424+
Marks,
425+
DENSE_RANK() OVER(PARTITION BY Subject ORDER BY Marks DESC) Rank
426+
FROM ExamResult
427+
ORDER BY Studentname,
428+
Rank;
429+
```
430+
431+
Результат:
432+
433+
![ ](images/SQL/output-of-dense_rank-function.png)
434+
435+
Ну, и на последок, продемонстрируем разницу между `DENSE_RANK` и `RANK`:
436+
437+
```sql
438+
SELECT Studentname,
439+
Subject,
440+
Marks,
441+
RANK() OVER(PARTITION BY StudentName ORDER BY Marks ) Rank
442+
FROM ExamResult
443+
ORDER BY Studentname,
444+
Rank;
445+
```
446+
447+
448+
```sql
449+
SELECT Studentname,
450+
Subject,
451+
Marks,
452+
DENSE_RANK() OVER(PARTITION BY StudentName ORDER BY Marks ) Rank
453+
FROM ExamResult
454+
ORDER BY Studentname,
455+
Rank;
456+
```
457+
458+
![ ](images/SQL/difference-between-rank-and-dense_rank.png)
459+
460+
![ ](images/SQL/difference-between-rank-and-dense_rank-functio.png)
461+
462+
342463
`NTILE` – функция Transact-SQL, которая делит результирующий набор на группы по определенному столбцу.
343464

465+
Например:
466+
467+
```sql
468+
SELECT *,
469+
NTILE(2) OVER(
470+
ORDER BY Marks DESC) Rank
471+
FROM ExamResult
472+
ORDER BY rank;
473+
```
474+
475+
Результат:
476+
477+
![ ](images/SQL/ntilen-sql-rank-function.png)
478+
479+
Пример 2:
480+
481+
```sql
482+
SELECT *,
483+
NTILE(3) OVER(
484+
ORDER BY Marks DESC) Rank
485+
FROM ExamResult
486+
ORDER BY rank;
487+
```
488+
489+
Результат:
490+
491+
![ ](images/SQL/ntilen-function-with-partition.png)
492+
493+
Пример 3:
494+
495+
```sql
496+
SELECT *,
497+
NTILE(2) OVER(PARTITION BY subject ORDER BY Marks DESC) Rank
498+
FROM ExamResult
499+
ORDER BY subject, rank;
500+
```
501+
502+
Результат:
503+
504+
![ ](images/SQL/output-of-ntilen-function-with-partition.png)
505+
344506
[к оглавлению](#sql)
345507

346508
## Для чего используются операторы `INTERSECT`, `EXCEPT` в Transact-SQL?
@@ -396,3 +558,4 @@ GROUP BY download_count;
396558
+ [Quizful](http://www.quizful.net/interview/sql)
397559

398560
[Вопросы для собеседования](README.md)
561+

0 commit comments

Comments
 (0)