Функция агрегирования для нескольких групп по - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь получить город с наибольшим количеством заказов каждый день.Я немного озадачен тем, как работают функции агрегации, когда столбцы имеют несколько групп.

Предположим, есть таблица Поездки со столбцами:
* идентификатор заказа (уникальный)
* город
* дата

Данные похожи на вопрос в leetcode sample

Я хочу найти город с наибольшим количеством заказов каждыйдень.

select 
    date, 
    city, 
    count(*) as city_cnt
from trips a
group by date, city
having count(*) = (select max(count(*)) 
                   from trips b 
                   where b.date = a.date 
                   group by b.city)

Этот код может получить ожидаемый результат, но я думаю, что может быть лучшее решение.

Задача 1 : Любой другой способ получить результат?

Проблема 2 : Сначала я попытался использовать max (count (*)) в первом предложении «SELECT» без предложения «HAVING».Есть ошибка «не групповая функция для одной группы»:

select 
    date, 
    city, 
    max(count(*)) as max_city_cnt
from trips a
group by date, city

Я думал, count (*) может рассчитать ежедневный номер заказа каждого города, с помощью функции max () я мог бы получить самый большой номер заказакаждого дня.Но это не работает.Может ли кто-нибудь объяснить это?

Проблема 3 : Мне также не очень ясно, как соотносятся «разбиение по» в оконной функции и «группировка по» ;

select
    date,
    city,
    count(id) city_cnt,
    rank() over (partition by date order by count(id) desc) d_rank
from trips
group by date, city
;

Для кода в оконной функции :

rank() over (partition by date order by count(id) desc) d_rank
  1. Рассчитывается ли количество (id) в соответствии с условием "GROUP BY"?
  2. Рейтинг () зависит только от чисел в каждый день?-> Чтобы получить звание ежедневного номера заказа каждого города в данный день.

Заранее спасибо!

1 Ответ

0 голосов
/ 07 февраля 2019

Ваша версия, использующая RANK, вероятно, наименее многословна и также наиболее эффективна.Но вам нужен подзапрос, чтобы ограничить каждую группу городов / дат записью с наибольшим количеством:

WITH cte AS (
    SELECT date, city, COUNT(id) city_cnt,
        RANK() OVER (PARTITION BY date ORDER BY COUNT(id) DESC) d_rank
    FROM trips
    GROUP BY date, city
)

SELECT date, city
FROM cte
WHERE d_rank = 1;

Приведенный выше CTE присваивает ряды рангов каждой группе городов в один и тот же день.Затем мы ограничиваемся только городами, имеющими наибольшее количество за каждый день.Обратите внимание, что RANKDENSE_RANK) допускают связи, поэтому, если на первое место привязано более одного города с наибольшим количеством голосов в определенный день, вышеупомянутый запрос подхватит его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...