【问题标题】:Apply aggregate function to all columns on table with group by使用 group by 将聚合函数应用于表上的所有列
【发布时间】:2022-01-13 20:45:13
【问题描述】:

我正在尝试根据分组选择所有相同的列

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 |
+------+-------+---------+----------+-----------+--------------+

我正在寻找的输出是:

+------+-------+---------+----------+-----------+--------------+
| 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 ...

【问题讨论】:

    标签: sql database postgresql group-by


    【解决方案1】:

    您无法避免单独列出所有列。此外,如果您使用 min 的所有列对于 group by 列的每个组合都有相同的值,那么使用 min 将非常低效 - 只需在您的 select 和 group by 子句中列出它们

    【讨论】:

      【解决方案2】:

      您可以使用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 和指向第一个表的外键的表.

      【讨论】:

        猜你喜欢
        • 2017-09-16
        • 1970-01-01
        • 2014-08-24
        • 2013-12-03
        • 2012-04-27
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        相关资源
        最近更新 更多