【问题标题】:Sumif in Postgresql between two tables两个表之间的 Postgresql 中的 Sumif
【发布时间】:2018-04-05 21:28:51
【问题描述】:

这是我的两个示例表。

表“中断”(列格式为文本、时间戳、时间戳)

+-------------------+----------------+----------------+
| outage_request_id |  actual_start  |   actual_end   |
+-------------------+----------------+----------------+
| 1-07697685        | 4/8/2015 4:48  | 4/8/2015 9:02  |
| 1-07223444        | 7/17/2015 4:24 | 8/01/2015 9:23 |
| 1-07223450        | 2/13/2015 4:24 | 4/29/2015 1:03 |
| 1-07223669        | 4/28/2017 9:20 | 4/30/2017 6:58 |
| 1-08985319        | 8/24/2015 3:18 | 8/24/2015 8:27 |
+-------------------+----------------+----------------+

和第二个表“价格”(列格式为数字,时间戳)

+-------+---------------+
| price |     stamp     |
+-------+---------------+
| -2.31 | 2/1/2018 3:00 |
| -2.35 | 2/1/2018 4:00 |
| -1.77 | 2/1/2018 5:00 |
| -2.96 | 2/1/2018 6:00 |
| -5.14 | 2/1/2018 7:00 |
+-------+---------------+

我的目标:对每个 outage_request_id 的开始时间和停止时间之间的价格求和。

我不知道如何正确地加入表格并获得这些中断时间戳范围内的价格总和。

【问题讨论】:

    标签: postgresql sumifs


    【解决方案1】:

    我不能保证这是有效的(事实上,对于非常大的表,我很有信心它不是),但这在理论上应该可以让你得到你想要的:

    select
      o.outage_request_id, o.actual_start, o.actual_end,
      sum (p.price) as total_price
    from
      outage o
      left join prices p on
        p.stamp between o.actual_start and o.actual_end
     group by
       o.outage_request_id, o.actual_start, o.actual_end
    

    【讨论】:

    • 嗯。我得到一个零价格总和。一个问题是,中断表是带时区的时间戳,而价格表是不带时区的时间戳。这对加入很重要吗?时间实际上是正确的。所以我在表“中断”中的时间戳看起来像 2015-04-08 04:48:00-04。我在“价格”中的时间戳看起来像 2018-01-01 01:00:00
    • 格式差异是中断表时间戳末尾的“-04”。
    • 看起来中断表有带时区的时间戳,而价格表有没有时区的时间戳。实际上我不确定在这种情况下等式关系是如何工作的,但我是 PostgreSQL,在这种情况下有很好的记录。你知道为什么会有不同的数据类型,你能协调它们吗?
    • 啊哈!我的实际代码错误地在价格表中有一个不跨越任何中断时间的时间戳 WHERE 子句。只需要删除它。您的代码效果很好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 2017-05-12
    • 2013-02-26
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多