将 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 函数首先将最小值和最大值添加到每一行。然后每一行都有自己的系列。