Как выбрать одну строку при группировке по столбцам и по максимальной дате?
У меня есть следующие данные, которые я хотел бы отфильтровать, поэтому я получаю только одну строку на основе группировки первого столбца и выбираю максимальную дату
Co2 содержит уникальные значения
col1 | col2 | date
1 | 123 | 2013
1 | 124 | 2012
1 | 125 | 2014
2 | 213 | 2011
2 | 214 | 2015
2 | 215 | 2018
Итак, я хочу получить следующие результаты:
1 | 125 | 2014
2 | 215 | 2018
Я попытался использовать несколько примеров, которые я нашел здесь (как и ниже) , а также другую группу по / distinct / max (дата), но без успеха
select t.*
from (select t.*,
row_number() over (partition by col1, col2 order by date desc) as seqnum
from t
) t
where seqnum = 1
3 ответа:
Измените разбиение в
row_number()
на только разбиение поcol1
, но сохраняйте порядок поdate desc
:select col1, col2, date from ( select col1, col2, date, row_number() over (partition by col1 order by date desc) as rn from yourtable ) x where rn = 1
Смотрите SQL Fiddle with Demo.
Так как вы разбивали и на
col1
, и наcol2
, вы получали уникальные значения для каждой строки. Таким образом, он не вернет строку с максимальной датой.
Я предпочитаю метод bluefeet, но вот эквивалент, использующий MAX:
SELECT t.col1, t.col2, t.date FROM yourtable t JOIN ( SELECT col1, MAX(date) maxDate FROM yourtable GROUP BY col1 ) t2 on t.col1 = t2.col1 AND t.date = t2.maxDate
SQL Fiddle Demo (заимствовано из другого поста)