我有一张table:
| 用户id|类型|日期|
| - -----|- -----|- -----|
| 一个|质数|2022 - 05 - 31 - 2022 - 05 - 31 - 2022 - 2023 - 05 - 21|
| 一个|平常的|2022 - 06 - 30 - 2022 - 2023 - 2023 - 2023 - 2024 - 2025 - 2025 - 2025 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026|
| 一个|平常的|2022 - 07 - 31 - 2022 - 07 - 21 - 22|
| 一个|平常的|2022 - 09 - 31 - 2022 - 09 - 31|
我需要得到一个按user_id、类型和有效期分组的表。主要的困难是周期可能不是连续的(它们之间的距离超过1个月):
Otput应为:
| 用户id|类型|开始月份|月末|
| - -----|- -----|- -----|- -----|
| 一个|质数|2022 - 05年|2022 - 05年|
| 一个|平常的|2022 - 06年|2022 - 07|
| 一个|平常的|2022 - 09| 2022 - 09|
2条答案
按热度按时间hjqgdpho1#
在另一种方法中,我们可以使用
row_number
函数如下:demo
hrirmatl2#
这是一个典型的缺口和孤岛问题,您需要构建一个更精细的分区。为了做到这一点,您:
| 用户id|类型|开始_dt| end_dt|
| - -----|- -----|- -----|- -----|
| 一个|质数|2022 - 05 - 31 - 2022 - 05 - 31 - 2022 - 2023 - 05 - 21| 2022 - 05 - 31 - 2022 - 05 - 31 - 2022 - 2023 - 05 - 21|
| 一个|平常的|2022 - 06 - 30 - 2022 - 2023 - 2023 - 2023 - 2024 - 2025 - 2025 - 2025 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026| 2022 - 07 - 31 - 2022 - 07 - 21 - 22|
| 一个|平常的|2022 - 09 - 30 - 2022 - 09 - 30| 2022 - 09 - 30 - 2022 - 09 - 30|
查看演示here。
DATE_TRUNC('MONTH', your_date)
转换为该月的第一天。