【问题标题】:How to retrieve a certain number of records using GROUP BY and ORDER BY in SQL (postgres)?如何在 SQL(postgres)中使用 GROUP BY 和 ORDER BY 检索一定数量的记录?
【发布时间】:2018-10-31 11:56:00
【问题描述】:

考虑一个包含 N 列的 postgresql 表。一列包含二项式分类[0 1]。我想按照下一个语法按此字段对数据进行分组(我对 python 使用 psycopg2,对 nodejs 使用 pg):

SELECT dummy_field,
COUNT(*)
FROM __table__
WHERE q_id = '2F5543E89823'
GROUP BY dummy_field

此查询返回例如:[(0, 1606), (1, 6674)] 值。我更改了上述语法,以便仅包含基于CURRENT_TIMESTAMP 的最后两天:

那就是:

...
AND date_field > CURRENT_TIMESTAMP - INTERVAL '2 days'
GROUP BY dummy_field

但是,我想在不同的查询中仅检索基于 ORDER BY date_field DESC LIMIT 1000 的最后 1000 条记录。由于选择字段不包括 date_field 我收到此错误:

列“field.date_field”必须出现在 GROUP BY 子句中或用于聚合函数中

为了避免这个错误,我遵循了这样的语法:

SELECT dummy_field, date_field,
COUNT(*)
FROM __table__
WHERE q_id = '2F5543E89823'
GROUP BY dummy_field, date_field
ORDER BY date_field DESC LIMIT 1000

然而这不是我想要的。我想使用 COUNT(*) 和 GROUP BY dummy_field,当 date_field 以 DESC 方式排序时,只考虑最后 1000 条记录。

是否有其他替代方法来处理此结果?提前致谢。

【问题讨论】:

    标签: sql postgresql psycopg2


    【解决方案1】:

    试试这个。通常,您先对其进行 LIMIT,然后再对其进行 GROUP/COUNT

    SELECT      dummy_field, COUNT(*) AS rows
    FROM        (
                    SELECT      dummy_field, q_id
                    FROM        __table__
                    WHERE       date_field > CURRENT_TIMESTAMP - INTERVAL '2 days'
                                AND t.q_id = '2F5543E89823'
                    ORDER BY    date_field DESC
                    LIMIT       1000
                ) AS t
    GROUP BY    dummy_field
    ORDER BY    dummy_field;
    

    我不太确定您是否希望 q_id1000 LIMIT 标准之内或之外。但是您可以轻松地将其移到 GROUP BY 上方以更改行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2015-03-06
      • 2014-08-31
      • 1970-01-01
      • 2019-01-21
      相关资源
      最近更新 更多