【问题标题】:Populating Time Dimension with SQL script - Teradata使用 SQL 脚本填充时间维度 - Teradata
【发布时间】:2017-04-08 05:13:10
【问题描述】:

伙计们,

我正在尝试使用 SQL 脚本填充时间维度表。

预期输出如下所示。

& 下面是部分 SQL 脚本,它没有给出正确的输出。

SEL   calendar_date AS DATE_,
      RANK( ) OVER ( ORDER BY calendar_date) AS Date_Key,
      RANK( ) OVER ( ORDER BY EXTRACT(MONTH FROM CALENDAR_DATE)) AS Month_Key
FROM  SYS_CALENDAR.CALENDAR 
ORDER BY calendar_Date

您能帮我找出代码中的问题吗?

由于代码卡在 Month_Key 人口中,我还没有完成剩余代码...

【问题讨论】:

  • 到底出了什么问题?您是否担心跳级数字或其他问题?

标签: sql teradata


【解决方案1】:

当你有 sys_calendar.calendar 时,我不明白这一点

select      calendar_date

           ,day_of_calendar     - 32872     as day_key
           ,month_of_calendar   -  1080     as month_key
           ,quarter_of_calendar -   360     as quarter_key
           ,year_of_calendar    -  1989     as year_key

from        sys_calendar.calendar 

-- where       calendar_date between date '2015-09-25' and date '2015-10-05'

-- order by    calendar_date

+---------------+---------+-----------+-------------+----------+
| calendar_date | day_key | month_key | quarter_key | year_key |
+---------------+---------+-----------+-------------+----------+
| 2015-09-25    | 9,399   |       309 |         103 |       26 |
| 2015-09-26    | 9,400   |       309 |         103 |       26 |
| 2015-09-27    | 9,401   |       309 |         103 |       26 |
| 2015-09-28    | 9,402   |       309 |         103 |       26 |
| 2015-09-29    | 9,403   |       309 |         103 |       26 |
| 2015-09-30    | 9,404   |       309 |         103 |       26 |
| 2015-10-01    | 9,405   |       310 |         104 |       26 |
| 2015-10-02    | 9,406   |       310 |         104 |       26 |
| 2015-10-03    | 9,407   |       310 |         104 |       26 |
| 2015-10-04    | 9,408   |       310 |         104 |       26 |
| 2015-10-05    | 9,409   |       310 |         104 |       26 |
+---------------+---------+-----------+-------------+----------+

【讨论】:

  • 基本上我正在尝试使用 SQL 脚本构建一个时间维度,该脚本对 Teradata 和 SQL Server 也很有用(尽管脚本中可能需要进行细微的语法更改)......在提供的答案中,我不确定你为什么要从列中减去数字?例如:- day_of_calendar - 32872 作为 day_key
  • Teradata 日历表从 1900-01-01 开始。减法是为了将其与您要求的结果相匹配
【解决方案2】:

RANK() OVER (ORDER BY EXTRACT(MONTH FROM CALENDAR_DATE)) AS Month_Key 更改为使用DENSE_RANK,因为看起来一年中一个月的所有行都应该具有相同的键。

SEL   calendar_date AS DATE_,
  RANK() OVER (ORDER BY calendar_date) AS Date_Key,
  DENSE_RANK() OVER (ORDER BY EXTRACT(YEAR FROM CALENDAR_DATE),EXTRACT(MONTH FROM CALENDAR_DATE)) AS Month_Key
FROM  SYS_CALENDAR.CALENDAR 
ORDER BY calendar_Date

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多