假设我在表格中有这些行:
ID | SomeColumn | SomeDateTime
---+------------+-------------
1 | X1 | 01-01-14 14:00:00
2 | X2 | 01-01-14 22:00:00
3 | Y1 | 01-03-14 12:00:00
4 | Y2 | 01-03-14 23:00:00
我怎样才能使SQL查询只抓取不同日期(选择最新时间)的行?也就是说,查询的结果应该是:
ID | SomeColumn | SomeDateTime
---+------------+-------------
2 | X2 | 01-01-14 22:00:00
4 | Y2 | 01-03-14 23:00:00
我试过这个,但它不起作用:
SELECT MAX(SomeDateTime),ID,SomeColumn,SomeDateTime
FROM MyTable GROUP BY (SomeDateTime::date)
我得到的错误是:
The column "MyTable.ID" needs to appear in the GROUP BY clause or be used in an aggregation function
我正在使用PostgreSQL,但如果你有其他数据库引擎的答案,我也会投票。
答案 0 :(得分:1)
SELECT DISTINCT ON (some_datetime::date)
id, some_column, some_datetime
FROM tbl
ORDER BY some_datetime::date, some_datetime DESC;
DISTINCT ON
的详细说明:
Select first row in each GROUP BY group?
这里稍微特殊的要求是在派生值上形成分区。对date
的强制转换是最简单,最快捷的方法。
每天返回一行(包含任何行的天数)。如果存在关联,则会选择任意行,除非您添加更多ORDER BY
项作为决胜局。
答案 1 :(得分:0)
我找到了一个相当可读的解决方案(即使它是带子查询的查询,可能效率低于提议的解决方案):
SELECT * FROM MyTable WHERE SomeDateTime IN (
SELECT MAX(SomeDateTime) FROM MyTable GROUP BY (SomeDateTime::date)
)