【问题标题】:PostgreSQL - Show the last N rows for each sorted groupPostgreSQL - 显示每个排序组的最后 N 行
【发布时间】:2020-01-31 15:43:17
【问题描述】:

关于以下帖子:

Retrieving the last record in each group - MySQL

Grouped LIMIT in PostgreSQL: show the first N rows for each group?

Postgresql limit by N groups

我编写了一个查询来查找按天划分的最后 3 组日志事件中的最新 3 个条目,总共最多 9 个条目,我设法从 postgresql 日志表中收集了以下数据:

我用来获取它们的查询如下:

SELECT
    *
FROM (
    SELECT
        ROW_NUMBER() OVER (PARTITION BY created_at::date ORDER BY created_at::time DESC) AS row_number,
        DENSE_RANK() OVER (ORDER BY created_at::date DESC) AS group_number,
        l.*
    FROM
        logs l
    WHERE
        account_id = 1) subquery
WHERE
    subquery.row_number <= 3
    AND group_number <= 3
LIMIT 9;

但是我错过了最后一步:结果按天按降序“分组”(这很好),但在每个组内按时间排序似乎不起作用。

实际上预期的顺序应该是(仅显示每一行的id):

| EXISTING ROW ORDERING | EXPECTED ROW ORDERING |
| --------------------- | --------------------- |         
           52                      56
           53                      53
           56                      52
           46                      48
           48                      47 
           47                      46
           30                      30
           31                      31
           32                      32

有什么想法吗?谢谢。

【问题讨论】:

    标签: sql postgresql group-by greatest-n-per-group


    【解决方案1】:

    如果您希望数据按特定顺序排列,那么您需要有一个order by。 SQL 表和结果集代表 无序 集。唯一的例外是最外面的查询有一个order by

    所以:

    order by created_at desc
    

    【讨论】:

    • @kstratis 。 . .很容易忘记结果集是无序的,尤其是当它们由于底层算法而看起来是有序的时。
    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多