Есть ли способ найти наибольшее значение по нескольким группам? - PullRequest
1 голос
/ 14 апреля 2020

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

SELECT 
date_part('day', tpep_pickup_datetime) AS trip_day,
date_part('hour', tpep_pickup_datetime) AS trip_hour,
count(*) AS numbers
FROM nyc_yellow_2019_01
GROUP BY trip_day, trip_hour
ORDER BY trip_day, count(*) desc)

Здесь перечислены все часы каждый день, но я хочу только самый верхний час для каждого дня.

Я также попытался создать таблицу представления, и из этого я написал:

SELECT DISTINCT(trip_day) MAX(numbers)
FROM busy_hour
GROUP BY trip_day;

, что близко, но не скажет мне точный час.

Наконец я попытался Предложение where в последнем запросе:

SELECT trip_hour
FROM busy_hour
WHERE
(SELECT DISTINCT(trip_day) MAX(numbers)
FROM busy_hour
GROUP BY trip_day);

Это привело меня к ошибке, указав, что подзапрос может вернуть только один столбец.

Любая помощь будет оценена

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Я пытаюсь найти самый загруженный час в день, учитывая месяц.

Если вы хотите самый загруженный час в день, используйте оконную функцию:

SELECT th.*
FROM (SELECT date_part('day', tpep_pickup_datetime) AS trip_day,
             date_part('hour', tpep_pickup_datetime) AS trip_hour,
             count(*) AS numbers,
             row_number() over (partition by date_part('day', tpep_pickup_datetime) order by count(*) desc) as seqnum
      FROM nyc_yellow_2019_01
      GROUP BY trip_day, trip_hour
     ) th
WHERE seqnum = 1;
1 голос
/ 14 апреля 2020

Вы, кажется, используете Postgres, как указывает использование date_part().

Если это так, вы можете использовать distinct on:

select distinct on (trip_day)
    date_part('day', tpep_pickup_datetime) as trip_day,
    date_part('hour', tpep_pickup_datetime) as trip_hour,
    count(*) as numbers
from nyc_yellow_2019_01
group by trip_day, trip_hour
order by trip_day, numbers desc
...