如何从dealdate列提取DAY/WEEK/MONTH/YEAR并创建summary tour details表
实现Tour Details表到summary tour details表的转换
原表:Tour Details
| dealdate | Tours | Weeknumber | Country | SubVenue |
|---|---|---|---|---|
| 2022-01-12 | 3 | 49 | India | SP1 |
| 2022-11-25 | 4 | 48 | India | SP2 |
| 2022-10-14 | 5 | 42 | India | SP3 |
| 2023-01-05 | 3 | 2 | India | SP1 |
| 2023-01-05 | 4 | 2 | India | SP2 |
| 2023-01-06 | 5 | 2 | US | SP1 |
| 2023-02-24 | 3 | 9 | US | SP2 |
| 2022-02-12 | 4 | 7 | US | SP3 |
| 2023-02-19 | 5 | 8 | US | SP1 |
| 2023-02-27 | 6 | 10 | US | SP2 |
需求说明
创建名为summary tour details的表,需包含以下内容:
- 从
dealdate字段提取的DAY、WEEK、MONTH、YEAR信息 - 按
SubVenue分组,生成格式为Tours {SubVenue}的分组标识Grp
目标表示例
| Grp | Day | Week | Month | Year |
|---|---|---|---|---|
| Tours SP1 | 1 | 49 | 12 | 2022 |
| Tours SP2 | 3 | 50 | 11 | 2023 |
| Tours SP1 | 2 | 3 | 1 | 2022 |
| Tours SP3 | 12 | 4 | 2 | 2023 |
不同数据库的实现代码
MySQL
CREATE TABLE `summary tour details` AS SELECT CONCAT('Tours ', SubVenue) AS Grp, DAY(dealdate) AS Day, WEEK(dealdate, 1) AS Week, -- 模式1表示周一是每周第一天,可根据需求调整 MONTH(dealdate) AS Month, YEAR(dealdate) AS Year FROM `Tour Details` GROUP BY SubVenue, Day, Week, Month, Year;
SQL Server
CREATE TABLE [summary tour details] AS SELECT 'Tours ' + SubVenue AS Grp, DAY(dealdate) AS Day, DATEPART(WEEK, dealdate) AS Week, MONTH(dealdate) AS Month, YEAR(dealdate) AS Year FROM [Tour Details] GROUP BY SubVenue, DAY(dealdate), DATEPART(WEEK, dealdate), MONTH(dealdate), YEAR(dealdate);
PostgreSQL
CREATE TABLE "summary tour details" AS SELECT 'Tours ' || "SubVenue" AS "Grp", EXTRACT(DAY FROM "dealdate")::INT AS "Day", EXTRACT(WEEK FROM "dealdate")::INT AS "Week", EXTRACT(MONTH FROM "dealdate")::INT AS "Month", EXTRACT(YEAR FROM "dealdate")::INT AS "Year" FROM "Tour Details" GROUP BY "SubVenue", "Day", "Week", "Month", "Year";
注意事项
- 若需使用原表中的
Weeknumber字段而非从日期提取,只需将代码中的周相关函数替换为Weeknumber即可 - 分组逻辑为按
SubVenue和日期的天/周/月/年维度分组,确保同一分组下的日期维度一致 - 部分数据库对带空格的表名/字段名需用反引号(MySQL)、方括号(SQL Server)或双引号(PostgreSQL)包裹
内容的提问来源于stack exchange,提问作者Burt Ox
相关产品推荐
相关产品推荐

