А НАПИШИ КА МНЕ ОКОНКУ, НО БЕЗ ИСПОЛЬЗОВАНИЯ ОКОНОК
Звучит как шиза, но это реальная задача, которая нередко встречается на интервью😁
Представьте, вам дают входную таблицу с баллами студентов (скрин 1) и вам нужно получить таблицу с их рангами по этим баллам (скрин 2)
Ну казалось бы, напишу просто:
SELECT Имя, Результат, row_number() over(order by Результат desc) as Ранг
from table
А интервьювер говорит, давай без оконок)
Вообще очень часто, когда задание выглядит как какая-то чушь, помогает такой интуитивно неочевидный прием, как джоин таблицы самой на себя
Мы можем для начала сделать cross join таблицы саму на себя, тогда напротив каждого студента мы получим оценки других студентов (в том числе его самого), например:
a.Имя | a.Результат | b.Имя | b.Результат
Дмитрий | 10 | Дмитрий | 10
Дмитрий | 10 | Виктор | 11
Дмитрий | 10 | Олег | 7
Дмитрий | 10 | Николай | 9
и т.д.
Теперь нужно заметить, что по сути ранг студента - это просто кол-во студентов, у которых ранг больше или равен чем у него
Например у Владимира нет ни одного студента, имеющего больший ранг чем у него, поэтому у него это кол-во равно 1 (т.е. только он сам). А у Павла есть студент, набравший больший балл чем он (Владимир), поэтому это кол-во равно 2 (Владимир+он сам)
Итоговый запрос получается таким:
SELECT a.Имя, a.Результат, COUNT(*) as Ранг
FROM table a
CROSS JOIN table b
WHERE b.Результат >= a.Результат
GROUP BY a.Имя, a.Результат
Если что-то было непонятно, пиши в комментарии👇
Звучит как шиза, но это реальная задача, которая нередко встречается на интервью😁
Представьте, вам дают входную таблицу с баллами студентов (скрин 1) и вам нужно получить таблицу с их рангами по этим баллам (скрин 2)
Ну казалось бы, напишу просто:
SELECT Имя, Результат, row_number() over(order by Результат desc) as Ранг
from table
А интервьювер говорит, давай без оконок)
Вообще очень часто, когда задание выглядит как какая-то чушь, помогает такой интуитивно неочевидный прием, как джоин таблицы самой на себя
Мы можем для начала сделать cross join таблицы саму на себя, тогда напротив каждого студента мы получим оценки других студентов (в том числе его самого), например:
a.Имя | a.Результат | b.Имя | b.Результат
Дмитрий | 10 | Дмитрий | 10
Дмитрий | 10 | Виктор | 11
Дмитрий | 10 | Олег | 7
Дмитрий | 10 | Николай | 9
и т.д.
Теперь нужно заметить, что по сути ранг студента - это просто кол-во студентов, у которых ранг больше или равен чем у него
Например у Владимира нет ни одного студента, имеющего больший ранг чем у него, поэтому у него это кол-во равно 1 (т.е. только он сам). А у Павла есть студент, набравший больший балл чем он (Владимир), поэтому это кол-во равно 2 (Владимир+он сам)
Итоговый запрос получается таким:
SELECT a.Имя, a.Результат, COUNT(*) as Ранг
FROM table a
CROSS JOIN table b
WHERE b.Результат >= a.Результат
GROUP BY a.Имя, a.Результат
Если что-то было непонятно, пиши в комментарии👇