SQL объединил максимальное значение двух столбцов - PullRequest
0 голосов
/ 25 марта 2019

у меня есть таблица с тремя столбцами

+------+------------+----------+
| item |    date    | sequence |
+------+------------+----------+
| a    | 30/11/2017 |        1 |
| a    | 30/11/2017 |        2 |
| a    | 31/12/2018 |        1 |
+------+------------+----------+

Я хотел бы выбрать максимальную дату и максимальную последовательность даты элемента, но

SELECT item, MAX(date), MAX(sequence of item-date-combination) FROM table GROUP BY item

не работает и

SELECT item, MAX(date), MAX(sequence) FROM table GROUP BY item

дает мне максимальную последовательность всех элементов, а не комбинаций элементов-дат.

как это:

+------+------------+----------+
| item |    date    | sequence |
+------+------------+----------+
| a    | 31/12/2018 |        1 |
+------+------------+----------+

Что я могу сделать?

так что, похоже, это так:

SELECT maxdate_q.item, maxdate_q.maxdate, maxseq_q.maxseq FROM (
    SELECT item, MAX(date) AS maxdate FROM table GROUP BY item) AS maxdate_q
LEFT JOIN (SELECT item, date, MAX(sequence) AS maxseq FROM table GROUP by item, date) AS maxseq_q ON maxseq_q.item = maxdate_q.item AND maxseq_q.date = maxdate_q.maxdate

Ответы [ 3 ]

2 голосов
/ 25 марта 2019

Вы можете использовать оконные функции:

select t.*  -- select whatever columns you really want.
from (select t.*,
             row_number() over (partition by item order by date desc, sequence desc) as seqnum
      from t
     ) t
where seqnum = 1;
1 голос
/ 25 марта 2019

В стандартном SQL вы можете использовать коррелированный подзапрос:

select t.*
from table t
where t.seq = (select t1.seq
               from table t1 
               where t1.item = t.item
               order by t1.date desc, t1.seq desc
               fetch first 1 rows only
              );

Некоторые другие СУБД имеют другой синтаксис для ограничения строк, например, SQL-сервер использует TOP условие или LIMIT для MySQL.

1 голос
/ 25 марта 2019

Вы можете использовать max() оконную функцию

  SELECT item, MAX(date) over(partition by item) as Mxdate,
         MAX(sequence) over(partition by item) as MxSeq
     FROM table 
...