繁体   English   中英

如何在SQL(postgres)中使用GROUP BY和ORDER BY检索一定数量的记录?

[英]How to retrieve a certain number of records using GROUP BY and ORDER BY in SQL (postgres)?

考虑一个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条记录。

还有其他替代方法可以解决此问题吗? 提前致谢。

尝试这个。 通常,您先限制它,然后再组/计数它

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;

我不太确定您是否要在1000 LIMIT条件之内或之外使用q_id 但是您可以轻松地将其移至GROUP BY之上以更改行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM