【问题标题】:How do I turn a Start Date column, an End Date column and a column with a Name into running dates and a column with that name for all dates in between如何将“开始日期”列、“结束日期”列和带有“名称”的列变成运行日期,并将带有该名称的列用于其间的所有日期
【发布时间】:2023-01-12 22:24:20
【问题描述】:

我需要帮助才能转动桌子 A

DATES Start_DATE END_DATE NAME
1.1.20 1.1.20 3.1.20 Name1
2.1.20
3.1.20
4.1.20
5.1.20 5.1.20 5.1.20 Name2
6.1.20

使用 SQL 写入表 B。

DATES NAME
1.1.20 Name1
2.1.20 Name1
3.1.20 Name1
4.1.20
5.1.20 Name2
6.1.20

所以我想在“NAME”的“START_DATE”和“END_DATE”范围内的所有“DATES”旁边添加“NAME”

我完全迷路了,非常感谢您的帮助!
谢谢

我尝试按 START_DATE 或按 NAME 或按 END_DATE 对数据进行分组,例如。

count(END_Date) over (ORDER BY DATE) AS grp

而不是使用

first_value(NAME) over (partition by grp order by DATE)

填补空白。不工作

【问题讨论】:

  • 为什么你的预期结果是 4.1.20?为什么要将 Name 列留空?为什么要多出一个5.1.20?您可以使用递归 CTE 生成每日列表,但我们需要了解预期结果才能为您提供示例脚本。 (您也可以使用“日历”/“日期”表)。
  • 感谢你的回复。我编辑了帖子。我希望现在更容易理解我的问题,初始情况是什么以及我想要实现什么。
  • 表 A 是否有完整的日期运行(没有遗漏日期)?另外,不同记录的开始和结束日期范围之间是否有重叠?
  • 谢谢你的问题。是的,表 A 没有遗漏日期。但是有一些重叠。日期代表假期。一个假期的日期范围内可能会出现另一个假期。

标签: sql snowflake-cloud-data-platform


【解决方案1】:

您可以使用 cross join 然后使用 distinct 来执行此操作。
请参考以下 SQL -

select distinct 
dates ,
case when dates between b.Start_DATE and    b.END_DATE then b.NAME else null end as name
from tablea a 
left join ( select distinct Start_DATE, END_DATE,   NAME from tableA) b on 
case when dates between b.Start_DATE and b.END_DATE then 1 else 0 end =1

select distinct Start_DATE, END_DATE, NAME from tableA - 这将为您提供开始、结束、名称列的所有组合。
case when dates between b.Start_DATE and b.END_DATE then 1 else 0 end =1 - 这将确保您没有不必要的交叉连接,但仍然会有一些交叉连接。

我用我的数据库做了一些研发,这是输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 2021-09-14
    • 2019-04-23
    • 2023-03-17
    • 2020-10-05
    • 1970-01-01
    • 2022-01-25
    • 2022-01-22
    相关资源
    最近更新 更多