我有一個格式如下的表格:
我覺得這應該很簡單,但我正在努力想出一個能根據其他具有共享鍵的行進行聚合的高性能查詢。例如,我想對鍵值為MediaLength的用戶的記錄進行求和,但只有當鍵值為Score且共享event_id的記錄大于或等于3時,才能進行求和。
簡單求和的結果:
SELECT SUM(value::float) FROM data WHERE key = 'MediaLength' AND user_id = '9765f312-0d0b-4db0-b4c5-217eec81d7c3'/code>
結果:40
我在這里想要達到的結果是15。在上面的表格中,你可以看到這些行是一個事件的子女。我只想對key = 'MediaLength'的value列進行求和,而其key = 'Score'的姐妹行的value >= 3。
這是我目前嘗試的查詢,但它似乎有點亂,而且由于子查詢回傳的記錄超過一條而無法作業:
select
sum(value::float)
filter (where (
selectd.value::float
from data d
where d.event_id = event_id
and d.key = 'Score'/span>
) >= 3)
from data
where user_id = '9765f312-0d0b-4db0-b4c5-217eec81d7c3'/span>
這是一個簡單的例子,但在未來,我還需要對可能的多個其他鍵進行過濾,所以也非常感謝任何關于如何擴展的建議。
uj5u.com熱心網友回復:
我只想對key='MediaLength'的值列進行求和,而它的姐妹行key='Score'的值>=3。
SELECT sum(value::float) --為什么要投幣?。
FROM data d
WHERE user_id = '9765f312-0d0b-4db0-b4c5-217eec81d7c3'/span>
AND key = 'MediaLength'
AND EXISTS (
SELECT FROM data ds
WHERE ds.event_id = d.event_id
AND ds.user_id = d.user_id - !
AND ds.key = 'Score'
AND ds.value >= 3
);
在這里,如果任何姐妹通過了過濾器,那么具有key = 'MediaLength'的行就符合條件。(可能有更多的姐妹沒有通過測驗。)
如果只能有一個單一合格的姐妹行(由唯一約束/索引強制執行),自連接就比較簡單了:
SELECT sum(value::float)
FROM資料d
JOIN data ds USING (event_id, user_id)
WHERE d.user_id = '9765f312-0d0b-4db0-b4c5-217eec81d7c3'/span>
AND d.key = 'MediaLength'
and ds.key = 'Score'/span>
and ds.value >= 3;
自連接將為多個符合條件的姐妹行產生多個結果行。
在其核心部分,這可以作為relational-division問題。特別是,由于......
在未來,我還需要對可能的多個其他鍵進行過濾
。
見:
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/324744.html
標籤:

