You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: sql.md
+163Lines changed: 163 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -333,14 +333,176 @@ __Курсор__ — это объект базы данных, который
333
333
## Расскажите об основных функциях ранжирования в Transact-SQL.
334
334
Ранжирующие функции - это функции, которые возвращают значение для каждой записи группы в результирующем наборе данных. На практике они могут быть использованы, например, для простой нумерации списка, составления рейтинга или постраничной навигации.
335
335
336
+
К примеру, у нас имеется набор данных следующего вида:
337
+
338
+

339
+
336
340
`ROW_NUMBER` – функция нумерации в Transact-SQL, которая возвращает просто номер записи.
337
341
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
+

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
+

366
+
367
+
338
368
`RANK` возвращает ранг каждой записи. В данном случае, в отличие от `ROW_NUMBER`, идет уже анализ значений и в случае нахождения одинаковых возвращает одинаковый ранг с пропуском следующего.
339
369
370
+
Например:
371
+
372
+
```sql
373
+
SELECT Studentname,
374
+
Subject,
375
+
Marks,
376
+
RANK() OVER(PARTITION BY Studentname ORDER BY Marks DESC) Rank
`DENSE_RANK` так же возвращает ранг каждой записи, но в отличие от `RANK` в случае нахождения одинаковых значений возвращает ранг без пропуска следующего.
341
403
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
+

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
+

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
0 commit comments