每天为每个ID选择最近的日期

时间:2015-03-27 10:53:46

标签: sql database

我已经检查了一些关于这个的问题,但它们并没有完全符合我的要求,涉及多个列和条件,所以我要将它提炼到最基本的形式。

SERIAL  DATE_TIME
1       01/01/2015 12:00:00
1       01/01/2015 15:00:00
2       01/01/2015 13:00:00
1       02/01/2015 12:00:00
2       02/01/2015 12:00:00
2       02/01/2015 09:00:00

每个序列可能在表中有多行,每天有多个条目。我想每天返回每个序列的最新条目。所以在这种情况下我想要:

SERIAL  DATE_TIME
1       01/01/2015 15:00:00
1       02/01/2015 12:00:00
2       01/01/2015 13:00:00
2       02/01/2015 12:00:00

理想情况下,该解决方案适用于任何DBMS。

3 个答案:

答案 0 :(得分:0)

我不确定任何RDBMS 部分,但在T-SQL中,可能还有很多其他部分,你可以这样做:

SELECT Serial, MAX(Date_Time) AS Date_Time
FROM [Table]
GROUP BY Serial, CAST(Date_Time AS DATE)

从我所能找到的,声音就像CAST一样是ANSI标准,所以它应该与#34;一切,"但是我对这些标准不够熟悉,特别是给你一个明确的答案。

这里有SQL Fiddle个工作。好吧,我认为你实际上并不需要这个,但如果你想让它看起来和你的例子完全一样(格式允许),你可以轻松地附加一个ORDER BY Serial, Date_Time来对它们进行排序。那样。

答案 1 :(得分:0)

不适用于所有SQL版本。但是,它将适用于支持WINDOW函数的那些:

CREATE TABLE #a
(
    serial INT, date_time DATETIME
);

INSERT INTO #a VALUES (1, '01/01/2015 12:00:00');
INSERT INTO #a VALUES (1,       '01/01/2015 15:00:00');
INSERT INTO #a VALUES (2,       '01/01/2015 13:00:00');
INSERT INTO #a VALUES (1,       '02/01/2015 12:00:00');
INSERT INTO #a VALUES (2,       '02/01/2015 12:00:00');
INSERT INTO #a VALUES (2,       '02/01/2015 09:00:00');

SELECT serial, date_time FROM (
SELECT serial, date_time,
        ROW_NUMBER() OVER(PARTITION BY serial, CAST(date_time AS DATE)  ORDER BY date_time DESC) row_num
FROM  #a 
) a 
WHERE a.row_num = 1

聚合的另一个选项:

SELECT serial, max_date_time FROM (
SELECT serial, CAST(date_time AS DATE) AS serial_date,
        MAX(date_time) AS max_date_time
FROM  #a 
GROUP BY serial, CAST(date_time AS DATE)
) a 

答案 2 :(得分:-1)

您可以使用以下查询:

select serial, max(date_time) from tbl group by serial;