Time series SQL:vertica中的高级时间片

Time series SQL:vertica中的高级时间片,time-series,lag,vertica,Time Series,Lag,Vertica,嘿,伙计们:我在vertica DB中有下表: +-----+------+----------+ | Tid | item | time_sec | +-----+------+----------+ | 1 | A | 1 | | 1 | B | 2 | | 1 | C | 4 | | 1 | D | 5 | | 1 | E | 6 | | 2 | A |

嘿,伙计们:我在vertica DB中有下表:

+-----+------+----------+
| Tid | item | time_sec |
+-----+------+----------+
|   1 | A    |        1 |
|   1 | B    |        2 |
|   1 | C    |        4 |
|   1 | D    |        5 |
|   1 | E    |        6 |
|   2 | A    |        5 |
|   2 | E    |        5 |
+-----+------+----------+
我的目标是创建位于时间窗口deltaT内的新项目组。这意味着第一个和最后一个项目的时间戳之间的差异小于或等于deltaT。示例:如果deltaT=2秒,我们将得到新表:

+-----+------+
| Tid | item |
+-----+------+
|  11 | A    |
|  11 | B    |
|  12 | B    |
|  12 | C    |
|  13 | C    |
|  13 | D    |
|  13 | E    |
|  14 | D    |
|  14 | E    |
|  15 | E    |
|  21 | A    |
|  21 | E    |
+-----+------+
以下是表格的演练: 首先,我们用tid1检查所有项目,并用tid1n创建子组,其中n是计数器。
Tid 11的第一个子组由A、B项组成,因为最后一项和第一项之间的差值是=这是我所得到的距离-它并没有回答你的问题,真的。但它可以构成几个指针:

WITH
-- your input
input(Tid,item,time_sec) AS (
          SELECT 1,'A',1
UNION ALL SELECT 1,'B',2
UNION ALL SELECT 1,'C',4
UNION ALL SELECT 1,'D',5
UNION ALL SELECT 1,'E',6
UNION ALL SELECT 2,'A',5
UNION ALL SELECT 2,'E',5
)
-- end of your input, start your "real" WITH clause here
,
input_w_ts AS (
  SELECT
    *
  , TIMESTAMPADD('SECOND',time_sec-1,TIMESTAMP '2000-01-01 00:00:00') AS ts
  FROM input
)
SELECT
  TS_LAST_VALUE(Tid) AS Tid
, item
, TS_LAST_VALUE(time_sec) AS time_sec
, tsr
FROM input_w_ts
TIMESERIES tsr AS '2 SECONDS' OVER (PARTITION BY item ORDER BY ts)
ORDER BY 1,4
;
Output:
Tid|item|time_sec|tsr
  1|A   |       1|2000-01-01 00:00:00
  1|B   |       2|2000-01-01 00:00:00
  1|A   |       1|2000-01-01 00:00:02
  1|C   |       4|2000-01-01 00:00:02
  1|D   |       5|2000-01-01 00:00:04
  1|E   |       6|2000-01-01 00:00:04
  2|A   |       5|2000-01-01 00:00:04

这就是我走了多远——这并不能回答你的问题,真的。但它可以构成几个指针:

WITH
-- your input
input(Tid,item,time_sec) AS (
          SELECT 1,'A',1
UNION ALL SELECT 1,'B',2
UNION ALL SELECT 1,'C',4
UNION ALL SELECT 1,'D',5
UNION ALL SELECT 1,'E',6
UNION ALL SELECT 2,'A',5
UNION ALL SELECT 2,'E',5
)
-- end of your input, start your "real" WITH clause here
,
input_w_ts AS (
  SELECT
    *
  , TIMESTAMPADD('SECOND',time_sec-1,TIMESTAMP '2000-01-01 00:00:00') AS ts
  FROM input
)
SELECT
  TS_LAST_VALUE(Tid) AS Tid
, item
, TS_LAST_VALUE(time_sec) AS time_sec
, tsr
FROM input_w_ts
TIMESERIES tsr AS '2 SECONDS' OVER (PARTITION BY item ORDER BY ts)
ORDER BY 1,4
;
Output:
Tid|item|time_sec|tsr
  1|A   |       1|2000-01-01 00:00:00
  1|B   |       2|2000-01-01 00:00:00
  1|A   |       1|2000-01-01 00:00:02
  1|C   |       4|2000-01-01 00:00:02
  1|D   |       5|2000-01-01 00:00:04
  1|E   |       6|2000-01-01 00:00:04
  2|A   |       5|2000-01-01 00:00:04

我真的不明白你想要什么。我甚至不能理解从输入表到输出表的逻辑,真的。我还发现,如果您不在示例中真正使用时间或时间文字,则很难理解。您的问题似乎是TIMESERIES子句的候选项(它实际上生成新行以创建无间隔的规则间隔的TIMESERIES),但我尝试了几种方法来应用它,但都是徒劳的。将问题转化为文字并不是一件小事。我会试着在一点时间内重写它。我不是真的明白你的意思。我甚至不能理解从输入表到输出表的逻辑,真的。我还发现,如果您不在示例中真正使用时间或时间文字,则很难理解。您的问题似乎是TIMESERIES子句的候选项(它实际上生成新行以创建无间隔的规则间隔的TIMESERIES),但我尝试了几种方法来应用它,但都是徒劳的。将问题转化为文字并不是一件小事。我会试着在一点时间内重写它。