如何从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
条款?
答案 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),因为窗口函数是在WHERE
和HAVING
之后应用的。
HAVING
子句不适用,因为您没有聚合行。
SELECT *
FROM (
SELECT *, rank() OVER (ORDER BY date_1 DESC) AS rnk
FROM tbl
WHERE field_1 = '1'
) sub
WHERE rnk = 1;
对于简单的情况,您的原始查询可能更快。 field_1
和date_1
上的索引是良好表现的关键。任一查询的最佳值为multicolumn index:
CREATE INDEX foo ON tbl (field_1, date_1 DESC);
如果date_1可以为NULL,您可能希望在索引和查询中使用NULLS LAST。参见: