sql - Redshift:将持续时间行按 24 小时时段拆分
问题描述
我还尝试将行拆分为 , 之间的 24 小时期间FromDate
范围Todate
。
例如,如果一个时间行给出如下,(之间的范围FromDate
是Todate
4 天,所以我想要 4 行)
ID---FromDate---Todate
1---2014-04-01 08:00:00.000---2014-04-04 12:00:00.000
我想看到的结果是这样的:
ID---FromDate---Todate---DateDiff(HH)
1---2014-04-01 08:00:00.000---2014-04-01 23:59:59.000---15
1---2014-04-02 00:00:00.000---2014-04-02 23:59:59.000---23
1---2014-04-03 00:00:00.000---2014-04-03 23:59:59.000---23
1---2014-04-04 00:00:00.000---2014-04-04 12:00:00.000---12
我找到了一个解决方案,但是当我在自己的辅助表中迭代时,它无法使用 Redshift 工作(与使用 SQL Server的解决方案不同!)
我不确定这是否可以使用 Redshift 或者我是否应该寻找另一种方法来解决它(比如自定义函数或类似的东西)。
谢谢!
解决方案
Redshift 有一个令人痛苦的“特征”。生成派生表很痛苦。让我假设您有一个足够大的表来生成一个计数表或数字表。
然后,剩下的就是日期算术。. . 但有点复杂。我手头没有 Redshift —— 它有来自 SQL Server 和 Postgres 的日期语法的奇怪组合
with numbers as (
select row_number() over () - 1 as n
from t
)
select t.id,
greatest(date_trunc('day', t.fromdate) + n.n * interval '1 day', t.fromdate) as fromdate,
least(date_trunc('day', t.fromdate) + (n.n + 1) * interval '1 day', t.todate) as todate
datediff(hour,
greatest(date_trunc('day', t.fromdate) + n.n * interval '1 day', t.fromdate),
least(date_trunc('day', t.fromdate) + (n.n + 1) * interval '1 day', todate)
) as hours
from t join
numbers n
on todate > date_trunc('day', t.fromdate) + n.n * interval '1 day';
这是一个使用 Postgres 的 db<>fiddle,它说明了这背后的主要思想。
推荐阅读
- c# - 重新渲染 Blazor 组件
- snowflake-cloud-data-platform - 在 Snowflake 中处理多个 SQL 语句的存储过程
- postgresql - 使用时区错误结果查询 Postgres 时间戳
- nginx - Nginx 位置正则表达式父、子和代理
- r - 在 Rstudio 中过滤特定月份的数据
- r - 将 R 3 数据帧导出到同一个 Excel 工作簿中的 3 个不同工作表
- mysql - 用单引号替换逗号
- java - 数组列表中的空指针异常 - 对象如何工作?
- unit-testing - 如何使用@MockBean 而不必再次@Inject Bean?
- tsql - 如何编写用于选择值已更改的行的 sql 查询?