选择按列的一部分分组的行的子集?

时间:2014-03-31 15:37:26

标签: sql database postgresql relational-database greatest-n-per-group

假设我在表格中有这些行:

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,但如果你有其他数据库引擎的答案,我也会投票。

2 个答案:

答案 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)
)