【问题标题】:How to query just the last record of every day如何只查询每天的最后一条记录
【发布时间】:2012-08-14 15:20:09
【问题描述】:

我有一个表幂,其中包含一个名为 sample_time 的 datetimetz 字段和一个名为 amp_hours 的列。

amp_hours 字段大约每两分钟获得一次记录,并在每晚午夜重置。

我想查看每天最后一条记录的 sample_time 和 amp_hours。

我对 SQL 很陌生,所以我可能忽略了一个明显的答案。

我在post 看到了关于如何选择组的最后一条记录的信息,但我对 SQL 不够熟悉,无法让它在日期时间工作:

我想使用lead()lag() 将记录的日期与下一条记录进行比较,但我使用的是 postgresql 8.3,我认为窗口是在 8.4 中引入的。

【问题讨论】:

    标签: postgresql timestamp


    【解决方案1】:

    试试这个:

    SELECT DISTINCT ON (sample_time::date) sample_time, amp_hours
    FROM power
    ORDER BY sample_time::date DESC, sample_time DESC;
    

    【讨论】:

    • 不错的解决方案,第一个DESC 是可选的。
    • 谢谢,这很聪明!如果我理解正确,DISTINCT ON (sample_time::date) 确保每天只返回一条记录,其余的由 ORDER BY 完成。如果我省略第二个 DESC,我会得到每天的第一条记录。第一个 DESC 只是首先生成最近的记录。
    • @RyanN: DISTINCT 自动按(待)不同的列排序。您可以添加一个明确的 ORDER BY - 不能与 DISTINCT 不同意 - 使用附加列和/或 DESC 而不是默认的 ASC 用于不同的列。
    • @ErwinBrandstetter:DISTINCT 可以通过不同的计划生成不同的行,其中只有一些以可预测的顺序保留数据。如果它选择使用哈希表而不是排序,则顺序将难以预测。如果您希望结果按某种顺序排列,最好指定ORDER BY,而不是依赖于实现细节。 @RyanN:如果没有ORDER BY,它可能会返回最近的行这次;不要指望那个。
    • @ErwinBrandstetter:除了 kgrittn 的 cmets,DISTINCT ON 与 DISTINCT 的不同之处在于 ORDER BY 子句中需要 ON() 内的列列表。否则会抛出此错误:“SELECT DISTINCT ON 表达式必须匹配初始 ORDER BY 表达式”
    最近更新 更多