【问题标题】:SQL - SUM of the for max IDSQL - 最大 ID 的总和
【发布时间】:2020-06-09 10:21:56
【问题描述】:

我有一张这样的桌子,

| id | name | subtask | maintask |
|----|------|---------|----------|
| 1  | t1   | 11      | 20       |
| 1  | t1   | 12      | 20       |
| 1  | t1   | 1       | 30       |
| 2  | t1   | 2       | 20       |
| 2  | t1   | 2       | 20       |

我想准备这样的结果

| id | name | sum_of_subtask | sum_of_maintask | diff |
|----|------|----------------|-----------------|------|
| 2  | t1   | 4              | 40              | 36   |

需要选择最大ID,然后对subtask和maintask求和,那么最后一列就是sum(subtask)和sum(maintask)的差

我尝试了以下查询,但它计算所有列的总和。

select max(id), name, sum(subtask),sum(maintask),sum(subtask-maintask) from tbl
group by name

【问题讨论】:

    标签: sql postgresql window-functions


    【解决方案1】:

    你只想要一排吗?如果是这样,请使用order bylimit

    select id, name, sum(subtask), sum(maintask), sum(subtask-maintask)
    from tbl
    group by id, name
    order by id desc
    limit 1;
    

    如果您的数据很大,在聚合之前过滤可能会更有效:

    select id, name, sum(subtask), sum(maintask), sum(subtask-maintask)
    from tbl
    where id = (select max(id) from tbl)
    group by id, name;
    

    如果您想要每个name 的最大id,那么过滤逻辑是:

    select id, name, sum(subtask), sum(maintask), sum(subtask-maintask)
    from tbl t
    where t.id = (select max(t2.id) from tbl t2 where t2.name = t.name)
    group by id, name;
    

    【讨论】:

      【解决方案2】:

      请使用以下查询,

      select id, name, sum(subtask), sum (maintask), sum(subtask)-sum (maintask)
      where id in
      (select max(id) from table)
      group by id, name;
      

      【讨论】:

        【解决方案3】:
        select id, name, sum(subtask), sum(maintask), sum(subtask-maintask)
        from tbl
        where id = (select max(id) from tbl)
        group by id, name
        

        【讨论】:

          猜你喜欢
          • 2020-07-10
          • 1970-01-01
          • 2021-03-02
          • 1970-01-01
          • 1970-01-01
          • 2019-08-03
          • 1970-01-01
          • 2021-12-27
          • 1970-01-01
          相关资源
          最近更新 更多