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