【问题标题】:How to query aggregated data with other columns如何使用其他列查询聚合数据
【发布时间】:2019-12-22 06:15:14
【问题描述】:

鉴于user_score 表中的以下记录,其中每个用户可以有多个分数,用户将区分用户 ID 可以具有相同的名称和角色。如何获取平均分数以及user_idrolename。我想按user_id分组。

所以对于我的下表,我期望结果为:

Name   Role  Score  user_id
Jack   CEO     6      123
Jack   CEO     2      456
Tony   Dev     5      234
Sham    QA     3      678

user_score 表数据:

id     name    role     score    user_id
1      Jack    CEO       4        123
2      Jack    CEO       8        123
3      Tony    Dev       9        234
4      Jack    CEO       2        456
5      Tony    Dev       1        234
6      Sham    QA        3        678

【问题讨论】:

    标签: sql database postgresql group-by


    【解决方案1】:

    只需使用group by:

    select id, name, role, avg(score), user_id
    from user_score
    group by id, name, role, user_id
    

    P.S.:您可以规范化数据,因为 3/5 列是多余的(它们不必要地重复)。我会在这个表中只留下scoreuser_id,将user_idrolename 移到另一个并使用user_id 作为连接键。

    【讨论】:

    • @GMB 当然是avg,我的错,非常感谢
    【解决方案2】:

    虽然您可能知道给定的 user_id 始终具有相同的名称和角色,但 PostgreSQL 无法知道这一点(除非您对数据进行规范化),因此它需要说明在给定 user_id。您需要在额外的列上包含一个虚拟聚合。

    select min(name) as name, min(role) as role, avg(score) as score, user_id 
        from user_score group by user_id
    

    除了min,您还可以使用maxstring_agg(distinct ...),或者可能还有其他一些东西

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-27
      • 2019-10-07
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      相关资源
      最近更新 更多