首页 > 解决方案 > 如何在 SQL(postgres)中使用 GROUP BY 和 ORDER BY 检索一定数量的记录?

问题描述

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

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. 由于选择字段不包括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 条记录。

有没有其他方法可以接近这个结果?提前致谢。

标签: sqlpostgresqlpsycopg2

解决方案


尝试这个。通常,您首先对其进行限制,然后对其进行分组/计数

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_id内部或外部1000 LIMIT。但是您可以将其移到上方以GROUP BY轻松更改行为。


推荐阅读