【发布时间】:2021-09-19 20:11:53
【问题描述】:
我有一个格式如下的表格:
我觉得这应该很简单,但我正在努力想出一个高性能查询,该查询可以使用共享键基于其他行执行聚合。例如,我想对具有键 MediaLength 的用户的行求和,但前提是共享 event_id 的键为 Score 的行大于或等于 3。
简单求和的结果:
SELECT SUM(value::float) FROM data WHERE key = 'MediaLength' AND user_id = '9765f312-0d0b-4db0-b4c5-217eec81d7c3'
Result: 40
我想在这里实现的结果是15。在上表中,您可以看到行是事件的子项。我只想总结value 列,其中key = 'MediaLength' 及其姊妹行与key = 'Score' 具有value >= 3。
这是我迄今为止尝试过的查询,但它似乎有点混乱,并且由于 more than one row returned by subquery 错误也不起作用:
select
sum(value::float)
filter (where (
select d.value::float
from data d
where d.event_id = event_id
and d.key = 'Score'
) >= 3)
from data
where user_id = '9765f312-0d0b-4db0-b4c5-217eec81d7c3'
这是一个简单的示例,但将来我还需要过滤可能的多个其他键,因此非常感谢任何有关如何扩展的建议。
【问题讨论】:
-
我认为您需要限定
d.event_id = event_id的范围以明确使用外部表的别名(d.event_id = outer.event_id),否则普通的event_id将引用内部data d关系为好吧。 -
请提供表格定义和一些示例数据作为文本,而不是屏幕截图(不鼓励数据!)。理想情况下,添加一个小提琴。随机示例:dbfiddle.uk/…
-
我冒昧地改进了描述。如果我说的不对,请纠正我。
-
谢谢欧文!是的,澄清是完美的:)
标签: sql postgresql relational-division