Проблем:
В набора от резултати бихте искали да разделите записи и да класирате редове във всеки дял, като добавите още една колона, за да покажете ранговете на редовете в дяла.
Пример:
Нашата база данни има таблица с име magazine с данни в следните колони:id
(първичен ключ), name
, category
и price
.
id | име | категория | цена |
---|---|---|---|
105 | Живот на село | начин на живот | 1,70 |
108 | Списание за новини | новини | 3,35 |
115 | Децибел | музика | 6,50 |
123 | Списание за барабани | музика | 6,50 |
145 | Залез | начин на живот | 12.00 |
155 | Свят | начин на живот | 9,50 |
158 | Клавиатура | музика | 8,45 |
Нека групираме списанията според категория и класирайте всяка група в низходящ ред по цена . Покажете позицията в класирането, името, категорията и цената за всяко списание.
Решение:
SELECT category, name, price, RANK() OVER (PARTITION BY category ORDER BY price DESC ) AS price_rank FROM magazine;
Ето резултата:
категория | име | цена | ценови_ранг |
---|---|---|---|
лайфстайл | Залез | 12.00 | 1 |
лайфстайл | Свят | 9,50 | 2 |
лайфстайл | Живот на село | 1,70 | 3 |
музика | Клавиатура | 8,45 | 1 |
музика | Децибел | 6,50 | 2 |
музика | Списание за барабани | 6,50 | 2 |
новини | Списание за новини | 3,35 | 1 |
Дискусия:
За да разделите редове и да ги класирате според позицията им в дяла, използвайте функцията RANK() с клаузата PARTITION BY.
Функцията RANK() на SQL ни позволява да добавим позиция на запис в резултатния набор или във всеки дял. В нашия пример ние класираме редове в рамките на дял.
Клаузата OVER() винаги идва след RANK(). OVER() трябва да съдържа клауза ORDER BY. Ако връщате рангове в рамките на дял, поставете клауза PARTITION BY в клаузата OVER(). PARTITION BY е последвано от израз или име на колона; в нашия пример използваме колоната category
(PARTITION BY category
).
Забележка: Ако не използвате дялове, можете да пропуснете PARTITION BY и просто да поставите клаузата ORDER BY в OVER().
След PARTITION BY поставете ORDER BY, последвано от имената на колоните или изразите за сортиране. В нашия пример ние сортираме в низходящ ред по колоната price
(ORDER BY price DESC
). Ключовата дума DESC показва низходящ ред на сортиране.
В горния пример, използвайки RANK() с PARTITION BY, резултатите са разделени на отделни групи списания по тяхната категория . Във всяка група редовете бяха сортирани по цена и след това се класира в тази група.