将 generate_serires 与分区结合使用,生成三重重复行
Using generate_serires with partition by generate triple duplicate row
我有一个 table 看起来像这样:
dt type
-----------------------------
2019-07-01 10:00:00 A
2019-07-01 10:15:00 A
2019-07-01 11:00:00 A
2019-07-01 08:30:00 B
2019-07-01 08:45:00 B
2019-07-01 09:30:00 B
每种类型都有自己的 dt 值,但每种类型都应该有一个连续的 15 分钟范围 dt。但是缺少一些行。因此,我使用 generate_strings()
添加日期,并使用 partition by
根据每个类型列添加日期:
SELECT
generate_series(min(dt) over (partition by type),
max(dt) over (partition by type), interval '15 minute')
, type
FROM t
我根据最小到最大 dt 在 dt 列中生成日期时间,范围为 15 分钟。
这是我期望得到的:
dt type
-----------------------------
2019-07-01 10:00:00 A
2019-07-01 10:15:00 A
2019-07-01 10:30:00 A
2019-07-01 10:45:00 A
2019-07-01 11:00:00 A
2019-07-01 08:30:00 B
2019-07-01 08:45:00 B
2019-07-01 09:00:00 B
2019-07-01 09:15:00 B
2019-07-01 09:30:00 B
但我得到的结果与预期的结果一样,但它 return 每种类型和日期时间的三倍。
例如
dt type
-----------------------------
2019-07-01 10:00:00 A
2019-07-01 10:15:00 A
2019-07-01 10:30:00 A
2019-07-01 10:45:00 A
2019-07-01 11:00:00 A
2019-07-01 10:00:00 A
2019-07-01 10:15:00 A
2019-07-01 10:30:00 A
2019-07-01 10:45:00 A
2019-07-01 11:00:00 A
2019-07-01 10:00:00 A
2019-07-01 10:15:00 A
2019-07-01 10:30:00 A
2019-07-01 10:45:00 A
2019-07-01 11:00:00 A
2019-07-01 08:30:00 B
. . .
这也发生在 B 型身上。
那么,根据我的查询,我需要更改什么才能获得预期结果?
您只想 运行 generate_series()
聚合:
SELECT type, generate_series(min_dt, max_dt, interval '15 minute')
FROM (SELECT type, MIN(dt) as min_dt, MAX(dt) as max_dt
FROM t
GROUP BY type
) t;
window 函数首先将最小值和最大值添加到每一行。然后每一行都有自己的系列。
我有一个 table 看起来像这样:
dt type
-----------------------------
2019-07-01 10:00:00 A
2019-07-01 10:15:00 A
2019-07-01 11:00:00 A
2019-07-01 08:30:00 B
2019-07-01 08:45:00 B
2019-07-01 09:30:00 B
每种类型都有自己的 dt 值,但每种类型都应该有一个连续的 15 分钟范围 dt。但是缺少一些行。因此,我使用 generate_strings()
添加日期,并使用 partition by
根据每个类型列添加日期:
SELECT
generate_series(min(dt) over (partition by type),
max(dt) over (partition by type), interval '15 minute')
, type
FROM t
我根据最小到最大 dt 在 dt 列中生成日期时间,范围为 15 分钟。
这是我期望得到的:
dt type
-----------------------------
2019-07-01 10:00:00 A
2019-07-01 10:15:00 A
2019-07-01 10:30:00 A
2019-07-01 10:45:00 A
2019-07-01 11:00:00 A
2019-07-01 08:30:00 B
2019-07-01 08:45:00 B
2019-07-01 09:00:00 B
2019-07-01 09:15:00 B
2019-07-01 09:30:00 B
但我得到的结果与预期的结果一样,但它 return 每种类型和日期时间的三倍。
例如
dt type
-----------------------------
2019-07-01 10:00:00 A
2019-07-01 10:15:00 A
2019-07-01 10:30:00 A
2019-07-01 10:45:00 A
2019-07-01 11:00:00 A
2019-07-01 10:00:00 A
2019-07-01 10:15:00 A
2019-07-01 10:30:00 A
2019-07-01 10:45:00 A
2019-07-01 11:00:00 A
2019-07-01 10:00:00 A
2019-07-01 10:15:00 A
2019-07-01 10:30:00 A
2019-07-01 10:45:00 A
2019-07-01 11:00:00 A
2019-07-01 08:30:00 B
. . .
这也发生在 B 型身上。
那么,根据我的查询,我需要更改什么才能获得预期结果?
您只想 运行 generate_series()
聚合:
SELECT type, generate_series(min_dt, max_dt, interval '15 minute')
FROM (SELECT type, MIN(dt) as min_dt, MAX(dt) as max_dt
FROM t
GROUP BY type
) t;
window 函数首先将最小值和最大值添加到每一行。然后每一行都有自己的系列。