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

时间:2018-10-31 02:58:27

标签: sql postgresql psycopg2

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

还有其他替代方法可以解决此问题吗?预先感谢。

1 个答案:

答案 0 :(得分:1)

尝试一下。通常,您先对其进行限制,然后对它进行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_id符合1000 LIMIT标准。但是您可以轻松地将其移至GROUP BY上方以更改行为。