[英]Apply aggregate function to all columns on table with group by
我正在嘗試 select 基於分組將相同的所有列
test_table
+------+-------+---------+----------+-----------+--------------+
| age | name | score | col1 | col2 | col3...col50 |
+------+-------+---------+----------+-----------+--------------+
| 20 | joe | 10 | DING | DONG | col3...col50 |
+------+-------+---------+----------+-----------+--------------+
| 20 | joe | 20 | DING | DONG | col3...col50 |
+------+-------+---------+----------+-----------+--------------+
| 22 | sue | 25 | SING | SONG | col3...col50 |
+------+-------+---------+----------+-----------+--------------+
| 22 | sue | 10 | SING | SONG | col3...col50 |
+------+-------+---------+----------+-----------+--------------+
| 50 | bob | 25 | RING | WRONG | col3...col50 |
+------+-------+---------+----------+-----------+--------------+
| 44 | joe | 15 | THING | THONG | col3...col50 |
+------+-------+---------+----------+-----------+--------------+
我正在尋找的 output 將是:
+------+-------+---------+----------+-----------+--------------+
| age | name |sum(score| col1 | col2 | col3...col50 |
+------+-------+---------+----------+-----------+--------------+
| 20 | joe | 30 | DING | DONG | col3...col50 |
+------+-------+---------+----------+-----------+--------------+
| 22 | sue | 35 | SING | SONG | col3...col50 |
+------+-------+---------+----------+-----------+--------------+
| 50 | bob | 25 | RING | WRONG | col3...col50 |
+------+-------+---------+----------+-----------+--------------+
| 44 | joe | 15 | THING | THONG | col3...col50 |
+------+-------+---------+----------+-----------+--------------+
我知道這是不對的,但我的一般思考過程是:
select
min(*),
sum(score)
from test_table
group by age, name
我想避免做類似的事情:
select
min(col1),
min(col2),
... cont ...,
min(col50),
sum(score)
from ...
您無法避免單獨列出所有列。 此外,如果您使用 min 的所有列對於 group by 列的每個組合都有相同的值,那么使用 min 將非常低效 - 只需在 select 和 group by 子句中列出它們
您可以使用DISTINCT ON
為每個組獲取一行,並將其與GROUP BY
查詢計算的總分數連接起來。 使用這種方法,將有一個包含來自組中某行的值的score
列和一個單獨的總分列。
WITH total_scores AS (
SELECT age, name, SUM(score) AS total_score
FROM test_table
GROUP BY age, name
)
SELECT DISTINCT ON (tt.age, tt.name)
tt.*, ts.total_score
FROM test_table tt
JOIN total_scores ts ON tt.age = ts.age AND tt.name = ts.name
也就是說,您似乎可以將數據規范化為兩個表,一個包含具有重復值的行(即除score
之外的所有其他內容),另一個包含score
和指向第一個表的外鍵的表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.