【问题标题】:Sql group by max column value after CTECTE后按最大列值分组的Sql
【发布时间】:2020-01-29 04:00:04
【问题描述】:

我有这个问题:

WITH messages_ranked 
AS ( 
   SELECT p.Date, p.RecipientId, p.RecipientType, p.Id, p.text, p.userId,
   ROW_NUMBER() OVER(PARTITION BY p.RecipientId, p.userId 
   ORDER BY p.Id DESC) 
   AS rk 

   FROM ChatMessages p
   JOIN ChatGroupMemberships as g 
   ON p.recipientId = g.groupId
   WHERE g.userId = XXX <-- user id
) 

SELECT date, recipientId as groupId, recipientType as groupType, id, text, userId, rk
FROM messages_ranked s 
where rk = 1

Order BY s.date DESC 

这给了我这个:

我需要减少此查询的结果行,以便对于每个唯一的 groupId,只返回最高值为 date 的行。

例如,前三行仅返回第一行,因为它们共享相同的groupId,并且第一行具有最新的日期。

我尝试在How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL? 处遵循示例,因为我的问题密切相关,但我似乎做错了。

【问题讨论】:

  • 这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或者完全是其他东西。

标签: sql


【解决方案1】:

我猜这是你想要的:

WITH messages_ranked AS ( 
      SELECT p.Date, p.RecipientId, p.RecipientType, p.Id, p.text, p.userId,
             ROW_NUMBER() OVER (PARTITION BY p.RecipientId ORDER BY p.dATE DESC) AS seqnum
      FROM ChatMessages p JOIN
           ChatGroupMemberships as g 
           ON p.recipientId = g.groupId
      WHERE g.userId = XXX <-- user id
     ) 
SELECT date, recipientId as groupId, recipientType as groupType, id, text, 
       userId, seqnum
FROM messages_ranked s 
WHERE seqnum = 1
ORDER BY s.date DESC ;

我认为您不需要使用两次row_number()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2012-02-14
  • 1970-01-01
  • 2023-03-14
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多