sql - 如何在 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 条记录。
有没有其他方法可以接近这个结果?提前致谢。
解决方案
尝试这个。通常,您首先对其进行限制,然后对其进行分组/计数
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
轻松更改行为。
推荐阅读
- java - Java Spring Boot 应用程序中“私有”辅助方法的替代方案
- mysql - 单个子查询很快。添加 1 个子查询很快。但是,将超过 1 个子查询一起添加会使 MySQL 崩溃。怎么修?
- reactjs - 如何删除 React 电话号码输入中的国际选项?
- node.js - 无法使用 typeorm 将 nodejs 应用程序连接到 heroku 上的 Postrgres 数据库
- javascript - 如何在每 1 小时后将存储在地图中的值更新到数据库,同时同步路由上不断更新地图的传入请求
- r - Shiny R:按输入变量过滤数据集
- mongodb - Spring Data Mongo ExampleMatcher 通过 AND 和 OR 组合获取可分页结果
- typescript - 无论 watch/ignore/ext 设置如何,nodemon.json 文件都会重新启动 nodemon
- node.js - EC2、Node.js - 调用位于同一服务器上的 API
- r - 在 R 中的文本文件中存储巨大矩阵的好方法