SQL: Как выбрать максимальную запись каждый день? - PullRequest
0 голосов
/ 11 февраля 2020

enter image description here

Я нашел много похожих вопросов, но никто не подходит идеально для моего случая, и я часами борюсь за решение. Моя таблица состоит из полей ДЕНЬ, ЧАС, СОБЫТИЕ 1, СОБЫТИЕ 2, СОБЫТИЕ 3. Поэтому у меня 24 строки каждый день. EVENT1, EVENT2, EVENT3 имеют некоторые значения, и я хотел бы выбирать каждый день только строку (я имею в виду запись), для которой EVENT3 имеет максимальное значение в течение дня (среди 24 часов). Окончательный результат будет один ряд в день

source table

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Один метод использует коррелированный подзапрос:

select t.*
from t
where t.event3 = (select max(t2.event3)
                  from t t2
                  where t2.date = t.date
                 );

В большинстве баз данных это имеет очень хорошую производительность с индексом на (date, event3).

Более каноническое решение использует row_number() :

select t.*
from (select t.*,
             row_number() over (partition by date order by event3 desc) as seqnum
      from t
     ) t
where seqnum = 1;
0 голосов
/ 11 февраля 2020

Другой вариант, помимо использования коррелированных подзапросов, заключается в том, чтобы написать это левое самостоятельное соединение, что-то вроде этого:

SELECT t.*
FROM t
LEFT JOIN t AS t2 ON t.day = t2.day AND t2.event3 > t.event3
WHERE t2.id IS NULL

Если вы хотите выбирать произвольную подходящую строку каждый день в случае нескольких строки с одним и тем же максимальным событием3, отметьте GROUP BY t.day в конце этого.

Я не уверен, как производительность этого будет сравниваться с решениями Гордона Линоффа, но они могут быть собраны в довольно похожий запрос в любом случае планы СУРБД.

...