PostgreSQL按指定usergroupid分组取单条数据报错求助
问题解决与正确SQL语句
原查询的问题
- 排序字段
entrytime未包含在GROUP BY子句中,也未使用聚合函数处理,违反PostgreSQL的分组规则,导致报错。 - 使用
LIMIT 1仅能返回一条数据,无法满足usergroupid=237935、761793各返回一条的需求。
正确查询语句
SELECT to_char_entrytime, usergroupid FROM ( SELECT TO_CHAR(entrytime, 'YYYY-MM-DD HH12:MI:SS') AS to_char_entrytime, usergroupid, ROW_NUMBER() OVER (PARTITION BY usergroupid ORDER BY entrytime DESC) AS rn FROM "public"."history" WHERE deviceid = 17355763 AND usergroupid IN (237935, 761793) ) t WHERE rn = 1 ORDER BY usergroupid;
逻辑说明
- 子查询通过
ROW_NUMBER() OVER (PARTITION BY usergroupid ORDER BY entrytime DESC),按usergroupid分区,每个分区内按entrytime倒序给记录编号,最新的记录编号为1。 - 外层查询筛选出编号为1的记录,即可得到每个目标
usergroupid对应的最新一条数据,同时规避原查询的分组错误问题。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

