【问题标题】:Get rows with the maximum date from a query从查询中获取具有最大日期的行
【发布时间】:2014-07-31 15:31:51
【问题描述】:

如何从 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 子句?

【问题讨论】:

  • HAVING 不适用于此处。它用于根据聚合值过滤结果,但您的结果集不包含聚合。

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


【解决方案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 中的最大日期。

我不认为你可以做到这一点。

这对你有用吗?

【讨论】:

    【解决方案2】:

    这可能有效;)

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

    【讨论】:

    • 没有必要为每个LIMIT指定OFFSET
    • 我需要所有记录,但不只是第一个
    【解决方案3】:

    只获取查询中最新日期的行,请使用窗口函数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。见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      相关资源
      最近更新 更多