Я новичок в PostgreSQL и пытаюсь научиться отображать значение ранжирования на основе динамической агрегации данных.
Учитывая эти данные:
country category cat_value Value
--------- ---------- ---------------------- ------------
UK Artist Jack Maynard 794
UK Artist Shannon Mathews 735
UK Artist Charlie Gard 587
UK City Leeds 142
UK City Manchester 264
UK City London 58
UK Movie Logan 482
UK Movie Beauty and the Beast 706
UK Movie Wonder Woman 721
USA Artist Louis C.K 693
USA Artist Michael Flynn 739
USA Artist Matt Lauer 724
USA City Las Vegas 790
USA City Los Angeles 756
USA City New York City 634
USA Movie Justice League 293
USA Movie IT 423
USA Movie Get Out 200
Если я хочу ранжировать по странам, я ожидаю, что он отсортирует значение и предоставит мне рейтинг, основанный только на стране. Вот пример:
country category cat_value Value Rank
UK Artist Jack Maynard 794 1
UK Artist Shannon Mathews 735 2
UK Movie Wonder Woman 721 3
UK Movie Beauty and the Beast 706 4
UK Artist Charlie Gard 587 5
UK Movie Logan 482 6
UK City Manchester 264 7
UK City Leeds 142 8
UK City London 58 9
USA City Las Vegas 790 1
USA City Los Angeles 756 2
USA Artist Michael Flynn 739 3
USA Artist Matt Lauer 724 4
USA Artist Louis C.K 693 5
USA City New York City 634 6
USA Movie IT 423 7
USA Movie Justice League 293 8
USA Movie Get Out 200 9
Если я хочу ранжировать по странам и категориям, то результаты будут такими:
country category cat_value Value Rank
UK City Manchester 264 1
UK City Leeds 142 2
UK City London 58 3
UK Movie Wonder Woman 721 1
UK Movie Beauty and the Beast 706 2
UK Movie Logan 482 3
UK Artist Jack Maynard 794 1
UK Artist Shannon Mathews 735 2
UK Artist Charlie Gard 587 3
USA City Las Vegas 790 1
USA City Los Angeles 756 2
USA City New York City 634 3
USA Movie IT 423 1
USA Movie Justice League 293 2
USA Movie Get Out 200 3
USA Artist Michael Flynn 739 1
USA Artist Matt Lauer 724 2
USA Artist Louis C.K 693 3
Есть простой способ сделать это? Прямо сейчас я использую select all и делаю это на python, но я подумал, что спрошу, есть ли способ сделать это непосредственно в запросе.
Должно быть, я неправильно использую агрегацию. Поскольку я группировал по определенным группам, я подумал, что это несколько агрегирует результаты для ранжирования каждого подраздела. Я понимаю, что это было неправильно. Спасибо, что указали на это.
Да, и похоже, что вам нужны функции окон и разделов.
Вы не упоминаете, используете ли вы прямой SQL-запрос или ORM, например SQLalchemy.
С помощью SQL-запроса:
SELECT country, category, cat_value, Value,
ROW_NUMBER() OVER (
PARTITION BY country, category
ORDER BY Value DESC
) AS 'Rank'
FROM data_table
Функции ранжирования: Row_number() создает уникальный номер строки для каждого результата, rank() создает номер строки, в котором равные результаты будут иметь одинаковое число, за которым следует пробел, плотно_rank() создает номер строки, в котором равные результаты будут иметь одинаковое число. не следует пробел.
PARTITION BY
определяет, как результаты делятся на группы
ORDER BY
указывает порядок внутри наборов результатов
@Потерянная душа . . . Я бы добавил, что если вы хотите, чтобы набор результатов был отсортирован определенным образом, вам нужно включить order by
в запрос.
Какое отношение этот вопрос имеет к объединению?