从查询中获取具有最大日期的行

时间:2014-07-31 15:31:51

标签: sql postgresql greatest-n-per-group having-clause

如何从PostgreSQL中的查询获取具有最大日期的所有行?

例如,如果我得到以下行:

1, 1, '2014-05-27'
2, 2, '2014-05-26'
3, 3, '2014-05-26'
4, 4, '2014-05-25'
5, 5, '2014-05-27'

我需要得到这个结果:

1, 1, '2014-05-27'
5, 5, '2014-05-27'

仅限具有最长日期的那些 - 但所有。 这可以通过在子查询中重复查询来完成:

SELECT *
FROM table
WHERE field_1 = '1'
AND date_1 = (SELECT MAX(date_1) FROM table WHERE field_1 = '1');

是否有更简单/更快的方式(不重复查询)?
也许使用HAVING条款?

3 个答案:

答案 0 :(得分:1)

我认为这会奏效:

select *
from table table1 join (
    select max(date_1) theMaxDate from table) table2
on table1. date_1= table2. theMaxDate

这里我们从表中选择MaxDate(别名为table2)。此maxDate将被引用为table2.theMaxDate。

然后我们加入表(我引用为table1,但这不是必需的)。

我们加入table1中的日期等于table2的最大日期。

我认为你不能这样做。

这对你有用吗?

答案 1 :(得分:0)

这可能有用;)

SELECT *
  FROM table
  WHERE field_1 = '1'
  ORDER BY date_1 DESC
  LIMIT 1 OFFSET 0

答案 2 :(得分:0)

要在查询中仅获取最新日期的行,请使用窗口函数rank()
需要子查询(或CTE),因为窗口函数是在WHEREHAVING之后应用的。

HAVING子句不适用,因为您没有聚合行。

SELECT *
FROM  (
    SELECT *, rank() OVER (ORDER BY date_1 DESC) AS rnk
    FROM   tbl
    WHERE  field_1 = '1'
    ) sub
WHERE  rnk = 1;

对于简单的情况,您的原始查询可能更快。 field_1date_1上的索引是良好表现的关键。任一查询的最佳值为multicolumn index

CREATE INDEX foo ON tbl (field_1, date_1 DESC);

如果date_1可以为NULL,您可能希望在索引查询中使用NULLS LAST。参见: