【问题标题】:Join with other table timestamp and sum of the columns与其他表时间戳和列总和连接
【发布时间】:2026-01-13 07:35:01
【问题描述】:

我正在尝试生成一个聚合表。

假设这是我的 tblA。

| type | name | timestap            |
|------|------|---------------------|
| prod | t1   | 2020-06-01 01:00:00 |
| prod | t2   | 2020-06-01 01:00:02 |
| prod | t3   | 2020-06-01 01:00:03 |
| test | t4   | 2020-06-01 02:20:02 |
| test | t5   | 2020-06-01 02:20:03 |

和tblB

| tid | starttime           | name | subtask | maintask |
|-----|---------------------|------|---------|----------|
| 1   | 2020-06-01 01:10:00 | t1   | 5       | 10       |
| 1   | 2020-06-01 01:10:00 | t1   | 6       | 10       |
| 1   | 2020-06-01 01:10:00 | t1   | 7       | 10       |
| 1   | 2020-06-01 01:10:00 | t1   | 8       | 10       |
| 2   | 2020-06-01 00:01:00 | t1   | 3       | 10       |
| 2   | 2020-05-01 00:02:00 | t1   | 5       | 15       |
| 4   | 2020-06-01 01:00:00 | t2   | 10      | 10       |
| 5   | 2020-06-01 11:00:10 | t2   | 10      | 20       |
| 5   | 2020-06-01 11:00:10 | t2   | 11      | 20       |
| 5   | 2020-06-01 11:00:10 | t2   | 12      | 20       |

现在我需要创建一个包含子任务和主要任务总和的报告表。但是有 where 条件,我们需要为每个名称选择 starttime 大于 tblA 时间戳的 tid,subtask,maintask。然后进行 SUM。

预期输出:

| type | name | sum_of_subtask | sum_of_maintask | diff |
|------|------|----------------|-----------------|------|
| prod | t1   | 26             | 40              | 14   |
| prod | t2   | 33             | 60              | 27   |

对于 t1,tid 为 1,因为它的开始时间是 > tblA.timestamp

对于t2,tid为5,tblB.starttime > tblA.timestamp

我要选择的行的另一个条件是MAX(tid) where starttime is > tblA.timestamp

然后获取行并求和,找出 diff 列上 sum_of_subtask,sum_of_maintask 之间的差异。

我不知道怎么写这个逻辑。

【问题讨论】:

    标签: sql postgresql join


    【解决方案1】:

    您需要简单的joinsum 进行聚合。这是demo

    select
      type,
      ta.name,
      sum(subtask) as sum_of_subtask,
      sum(maintask) as sum_of_maintask,
      sum(maintask - subtask) as diff
    from tblA ta
    join tblB tb
    on ta.name = tb.name
    where starttime > timestap
    group by
      type,
      ta.name;
    

    输出:

    | type | name | sum_of_subtask | sum_of_maintask | diff |
    | ---- | ---- | -------------- | --------------- | ---- |
    | prod | t1   | 26             | 40              | 14   |
    | prod | t2   | 33             | 60              | 27   |
    

    【讨论】:

    • 但是这对 t1 和 t2 的所有列求和,我需要对 starttime 为 > 的行求和,而不是 tblA 时间戳。
    • @Bhuvanesh 更新了我的答案。请检查并为您提供演示。
    • 非常感谢,但还有一个条件,我需要根据时间戳+最大时间戳的 tid 来选择要求和的行,我想我在那个问题中错过了这一点。您的查询有效,但即使我有超过 1 个 tid 的 starttime> 时间戳,然后是所有行的总和。取而代之的是选择 max(TID) 其中 starttime> 时间戳,该行需要求和。我也会修改问题。
    • @Bhuvanesh 你应该澄清一下。请创建一个新问题而不是编辑。如果你喜欢这个答案,请点击勾选标记接受它。谢谢
    最近更新 更多