#sql #postgresql
#sql #postgresql
Вопрос:
Это было бы нашим вкладом:
Имя | год | ценности |
---|---|---|
A | 2001 | 10 |
A | 2000 | 5 |
A | весь | 15 |
B | 2010 | 3 |
B | 2011 | 7 |
B | весь | 10 |
Мы должны отсортировать эту таблицу по возрастанию значений «ИТОГО», а затем по возрастанию значений ГОДА в пределах одного и того же ИМЕНИ.
Это было бы нашим результатом:
Имя | год | ценности |
---|---|---|
B | 2010 | 3 |
B | 2011 | 7 |
B | весь | 10 |
A | 2000 | 5 |
A | 2001 | 10 |
A | весь | 15 |
Ответ №1:
Я думаю, что я бы суммировал все значения, разделенные по имени, в CTE, отсортировал по ним, затем по имени, затем по году (с особым случаем для итога)
WITH cte AS ( SELECT *, SUM(values) OVER(PARTITION BY name) as sumval FROM yourdata ) SELECT name, year, values FROM cte ORDER BY sumval, name, CASE WHEN year = 'TOTAL' THEN '9999' ELSE year end
Вы также можете присоединить свои данные к самим себе только по строкам итога, то есть каждая строка ваших данных заканчивается соответствующей строкой итогов:
SELECT yourdata.* FROM yourdata INNER JOIN (SELECT name, values FROM yourdata WHERE year = 'TOTAL') t ON t.name = yourdata.name ORDER BY t.values, yourdata.name, CASE WHEN year = 'TOTAL' THEN '9999' ELSE year end
напр.
B 2010 3 TOTAL 10 B 2011 7 TOTAL 10 B TOTAL 10 TOTAL 10 A 2000 5 TOTAL 15 A 2001 10 TOTAL 10 A TOTAL 15 TOTAL 10
Последний столбец-это итоговая строка для имени, повторяющегося снова и снова, поэтому вы можете сортировать по итогу, затем по имени, чтобы разорвать связи, затем по годам (с 9999, чтобы поместить итог после числовых лет).