【发布时间】:2019-08-27 18:46:06
【问题描述】:
我试图为分组数据集获取mode(),但没有对结果进行分组。 (使用 Postgres 9.5,如果需要可以升级。)
例如用户有一个“最喜欢的颜色”,并且属于一个组。获取组内具有mode()“最喜欢的颜色”的用户列表。
窗口函数适用于大多数聚合,但mode() 似乎是一个与窗口函数不兼容的例外。还有其他方法可以解决这个问题吗?到目前为止,这是我一直在玩的东西......
有效但给出分组结果,我正在寻找未分组的结果:
SELECT group_id,
mode() WITHIN GROUP (ORDER BY color)
FROM users
GROUP BY group_id;
无效的语法(只是我想要完成的一个例子):
SELECT id, color, group_id,
mode(color) OVER (PARTITION BY group_id)
FROM users;
或者:
SELECT id, color, group_id,
mode() WITHIN GROUP (ORDER BY color) OVER (PARTITION BY group_id)
FROM users;
我尝试使用横向连接,但如果不在连接内部和外部重新迭代我的 WHERE 子句,就无法使其正常工作(当此查询变得更复杂时,我不希望这样做):
SELECT u1.id, u1.group_id, u1.color, mode_color
FROM users u1
LEFT JOIN LATERAL
(SELECT group_id, mode() WITHIN GROUP (ORDER BY color) as mode_color
FROM users
WHERE group_id = d1.group_id
GROUP BY group_id)
u2 ON u1.group_id = u2.group_id
WHERE u1.type = 'customer';
重要的是WHERE u1.type = 'customer' 保留在子查询之外,因为它稍后会在前半部分已经写入之后附加到查询中。
【问题讨论】:
-
您按
type过滤,但按group_id聚合。这使事情变得复杂,这将有助于了解两者之间的关系。一个是另一个的子组吗?它还提出了一个问题:究竟是哪种模式?过滤之后的那个,还是之前的那个(对于同一组中的 all 行)?请始终公开您的 Postgres 版本。
标签: sql postgresql aggregate-functions greatest-n-per-group window-functions