Как выбрать одну строку при группировке по столбцам и по максимальной дате?


У меня есть следующие данные, которые я хотел бы отфильтровать, поэтому я получаю только одну строку на основе группировки первого столбца и выбираю максимальную дату

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 5
sql

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 (заимствовано из другого поста)

    Select * from yourtable where date in 
(select max(date) from tab group by col1);