Sql 给区间表达式指定一个非常量值

Sql 给区间表达式指定一个非常量值,sql,vertica,Sql,Vertica,对于以下sql表达式: some_timstamp_field RANGE BETWEEN INTERVAL '5' second PRECEDING AND CURRENT ROW 我想将常量值'5'更改为表中某个字段的值(因此该值不是常量) 可以这样做吗?对于窗口框架外的动态间隔表达式,可以使用CAST(val作为间隔名称): 但对于窗框,这是不允许的,您将得到错误: ERROR: Window frame logical or physical offset must be a cons

对于以下sql表达式:

some_timstamp_field RANGE BETWEEN INTERVAL '5' second PRECEDING AND CURRENT ROW
我想将常量值
'5'
更改为表中某个字段的值(因此该值不是常量)


可以这样做吗?

对于窗口框架外的动态间隔表达式,可以使用CAST(val作为间隔名称):

但对于窗框,这是不允许的,您将得到错误:

ERROR: Window frame logical or physical offset must be a constant
更新: 假设您希望根据当前记录时间戳计算动态时间帧的记录数,解决方案可能如下所示:

WITH intervals AS
(
        SELECT '1 seconds' AS interval_name, CAST(1 AS INTERVAL SECOND) AS interval_value UNION ALL
        SELECT '5 seconds', CAST(5 AS INTERVAL SECOND) UNION ALL
        SELECT '10 seconds', CAST(10 AS INTERVAL SECOND)
), tnow AS
(
        SELECT NOW() AS ts
), tsdata AS(
        SELECT 4 as id, ts FROM tnow UNION ALL
        SELECT 3, ts - INTERVAL '3 second' FROM tnow UNION ALL
        SELECT 2, ts - INTERVAL '6 second' FROM tnow UNION ALL
        SELECT 1, ts - INTERVAL '20 second' FROM tnow
)
SELECT i.interval_name, t1.Id, t1.ts, COUNT(t2.id)
FROM tsdata t1
CROSS JOIN intervals i 
LEFT JOIN tsdata t2 ON t2.ts BETWEEN t1.ts - i.interval_value AND t1.ts
GROUP BY 1,2,3
ORDER BY 1,2,3

对于窗口框架外的动态间隔表达式,可以使用CAST(val作为间隔_名称):

但对于窗框,这是不允许的,您将得到错误:

ERROR: Window frame logical or physical offset must be a constant
更新: 假设您希望根据当前记录时间戳计算动态时间帧的记录数,解决方案可能如下所示:

WITH intervals AS
(
        SELECT '1 seconds' AS interval_name, CAST(1 AS INTERVAL SECOND) AS interval_value UNION ALL
        SELECT '5 seconds', CAST(5 AS INTERVAL SECOND) UNION ALL
        SELECT '10 seconds', CAST(10 AS INTERVAL SECOND)
), tnow AS
(
        SELECT NOW() AS ts
), tsdata AS(
        SELECT 4 as id, ts FROM tnow UNION ALL
        SELECT 3, ts - INTERVAL '3 second' FROM tnow UNION ALL
        SELECT 2, ts - INTERVAL '6 second' FROM tnow UNION ALL
        SELECT 1, ts - INTERVAL '20 second' FROM tnow
)
SELECT i.interval_name, t1.Id, t1.ts, COUNT(t2.id)
FROM tsdata t1
CROSS JOIN intervals i 
LEFT JOIN tsdata t2 ON t2.ts BETWEEN t1.ts - i.interval_value AND t1.ts
GROUP BY 1,2,3
ORDER BY 1,2,3

我认为这在Vertica的窗框规格中是不可能的。您可能会问另一个关于示例数据和所需结果的问题,看看是否有其他方法来解决您想要做的事情。尝试使用动态SQL,即通过shell或Python脚本编写SQL。在OLAP函数中,实际上所有的DBMS都至少大体上遵循ANSI标准,在这两者之间的
范围。。。下面的…
区间表达式必须是常量。正如@minaverma所指出的,生成SQL的SQL可以是您的朋友。但是,例如,试着将两组不同的标识符放在一个时间序列数据样本中,然后粘贴到问题中,每个标识符在
范围内需要不同的间隔,以及需要实现的目标。Vertica具有时间序列功能,可以帮助您以不同的方式解决业务问题。我认为在Vertica的窗口框架规范中,这是不可能的。您可能会问另一个关于示例数据和所需结果的问题,看看是否有其他方法来解决您想要做的事情。尝试使用动态SQL,即通过shell或Python脚本编写SQL。在OLAP函数中,实际上所有的DBMS都至少大体上遵循ANSI标准,在这两者之间的
范围。。。下面的…
区间表达式必须是常量。正如@minaverma所指出的,生成SQL的SQL可以是您的朋友。但是,例如,试着将两组不同的标识符放在一个时间序列数据样本中,然后粘贴到问题中,每个标识符在
范围内需要不同的间隔,以及需要实现的目标。Vertica具有时间序列功能,可以帮助您以不同的方式解决业务问题