выберите идентификатор с максимальной датой и сохраните все те же максимальные даты SQL - PullRequest
0 голосов
/ 09 июня 2018

У меня есть образец набора данных

id  category  date        value
1   a         2013-01-02  7
2   a         2013-01-02  2
3   a         2013-01-01  3
4   b         2013-01-01  1
5   b         2013-01-02  4
6   b         2013-01-03  5
7   c         2013-01-03  4
8   c         2013-01-03  8

Я хотел бы вернуть следующую таблицу в качестве вывода

id  date        
1   2013-01-02  
2   2013-01-02  
6   2013-01-03  
7   2013-01-03  
8   2013-01-03  

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

SELECT id,date
FROM order t1
INNER JOIN 
(
   SELECT id, MAX(date) as maxdate
   FROM order
   GROUP BY category
) t2
ON t1.id = t2.id
AND t1.date = t2.maxdate

Пожалуйста, посоветуйте, если у меня что-то не так.

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

Если вы используете sql-server-2012 и выше, вы также можете использовать это.

DECLARE @T TABLE (id INT,  category  VARCHAR(5), [date] date,        value int)
INSERT INTO @T VALUES

(1, 'a', '2013-01-02',  7),
(2, 'a', '2013-01-02',  2),
(3, 'a', '2013-01-01',  3),
(4, 'b', '2013-01-01',  1),
(5, 'b', '2013-01-02',  4),
(6, 'b', '2013-01-03',  5),
(7, 'c', '2013-01-03',  4),
(8, 'c', '2013-01-03',  8)

SELECT  id, [date] FROM (
    SELECT id, [date], RANK() OVER( PARTITION BY category order by [date] desc) RNK from @T
) AS t
WHERE RNK = 1

Результат:

id          date      
----------- ----------
1           2013-01-02
2           2013-01-02
6           2013-01-03
7           2013-01-03
8           2013-01-03
0 голосов
/ 09 июня 2018

Я бы сделал это, используя только subquery:

select o.*
from order o
where date = (select max(o1.date) 
              from order o1 
              where o1.category = o.category
             );
0 голосов
/ 09 июня 2018

Из вашего примера - вы, кажется, хотите запрос, который дает вам все строки, которые соответствуют максимальной дате в каждой категории?

Если это так, вам следует группировать по категории (не захватывайте идентификаториз вашего т2).Подвыбор должен дать вам категорию и максимальную дату, внешнее коррелированное объединение даст вам все строки, которые соответствуют этой категории и дате.

SELECT category,id,date
FROM order t1
INNER JOIN 
(
   SELECT category, MAX(date) as maxdate
   FROM order
   GROUP BY category
) t2
ON t1.category = t2.category
AND t1.date = t2.maxdate
...