【问题标题】:map/sample timeseries data to another timeserie db2将时间序列数据映射/采样到另一个时间序列 db2
【发布时间】:2018-06-04 03:23:11
【问题描述】:

我正在尝试合并两个 SQL(IBM bluemix 上的 DB2)查询的结果:

第一个查询创建一个从 startdate 到 enddate 的时间序列:

with dummy(minute) as (
      select TIMESTAMP('2017-01-01')
      from SYSIBM.SYSDUMMY1 union all
      select minute + 1 MINUTES
      from dummy
      where minute <= TIMESTAMP('2018-01-01')
     )
select to_char(minute, 'DD.MM.YYYY HH24:MI') AS minute
from dummy;

第二个查询从具有时间戳的表中选择数据。此数据应加入到上面生成的时间序列中。独立查询如下:

SELECT DISTINCT
  to_char(date_trunc('minute', TIMESTAMP), 'DD.MM.YYYY HH24:MI') AS minute,
  VALUE AS running_ct
FROM TEST
WHERE ID = 'abc'
AND NAME = 'sensor'
ORDER BY minute ASC;

我想得到的是一个包含两列的结果的查询:

  • 时间戳从 startdate 到 enddate 的第一列和
  • 第二个值按自己的时间戳排序到
  • 第一列(空时间戳=null)。

我该怎么做?

【问题讨论】:

    标签: sql join db2 time-series ibm-cloud


    【解决方案1】:

    一个更好的解决方案是生成一个范围,尤其是在您的详细信息表很大的情况下。这允许优化器使用索引来完成分桶,而不是在每一行上调用一个函数(这很昂贵)。

    所以是这样的:

    WITH dummy(temporaer, rangeEnd) AS (SELECT a, a + 1 MINUTE 
                                        FROM (VALUES(TIMESTAMP('2017-12-01'))) D(a)
                                        UNION ALL
                                        SELECT rangeEnd, rangeEnd + 1 MINUTE
                                        FROM dummy
                                        WHERE rangeEnd < TIMESTAMP('2018-01-31'))
    SELECT Dummy.temporaer, AVG(Test.value) AS TEXT
    FROM Dummy
    LEFT OUTER JOIN Test
                 ON Test.timestamp >= Dummy.temporaer
                    AND Test.timestamp < Dummy.rangeEnd
                    AND Test.id = 'abc'
                    AND Test.name = 'text'
    GROUP BY Dummy.temporaer
    ORDER BY Dummy.temporaer ASC;
    

    请注意,范围的末尾现在是排他性的,不像以前那样包括在内:您包括'2018-01-31' 的第一分钟,这可能不是您想要的。当然,不包括一个月的最后一天也让我觉得有点奇怪——你很可能真的想要&lt; TIMESTAMP('2018-02-01')

    【讨论】:

    • 嘿。做得好。谢谢!您的解决方案工作正常!实际上,您的代码比我上面的代码慢 0.1 秒,但我认为如果表中的数据比现在大(如您所说),这可能会改变。
    • 是的,你的权利:我真正想要的是“
    • 是否也可以在thant上进行多个join?比如先加入'text',然后加入'text2','text3'等等?
    • @eid - .1s 可能只是由于运行时的正常波动(特别是如果那是您第一次运行语句,当优化器首先必须准备语句并且没有' t 还有一个缓存计划)。是的,你可以有多个连接,但你有一个聚合 - 如果每个连接有多行,你将把行数相乘(称为笛卡尔积),这会抛出平均值。
    • 谢谢发条缪斯!还请查看我的新主题,您可以在其中看到我正在进行的整个工作流程(也许您有解决方案?):stackoverflow.com/questions/48058500/…
    【解决方案2】:

    找到一个可行的解决方案:

        with dummy(temporaer) as (
         select TIMESTAMP('2017-12-01') from SYSIBM.SYSDUMMY1
         union all
         select temporaer + 1 MINUTES from dummy where temporaer <= TIMESTAMP('2018-01-31'))
        select temporaer, avg(VALUE) as text from dummy
        LEFT OUTER JOIN TEST ON temporaer=date_trunc('minute', TIMESTAMP) and ID='abc' and NAME='text'
        group by temporaer
        ORDER BY temporaer ASC;
    

    干杯

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 2020-12-28
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 2011-11-12
      • 2014-12-15
      相关资源
      最近更新 更多