比较全的时间日期维表sql

本文介绍了一个日期维度表的构建过程,包括从日、周到年的各个层级的数据转换和计算。通过对日期进行细致划分,便于后续的数据分析和报表制作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--日期维表基本信息
       with  tmp_es_date_00 as 
       (
        select  
        regexp_replace(predict_date_day,'-','')                                                           as date_id             -- 日(yyyymmdd)
       ,predict_date_day                                                                                  as date_code           -- 日(yyyy-mm-dd)      
	   ,concat(year(predict_date_day),'年',month(predict_date_day),'月',day(predict_date_day),'日')                                   as date_name           -- 日(yyyy年mm月dd日)
	   ,dayofweek(predict_date_day)                                                                       as week_day_id         -- 周ID(周几)
	   ,case dayofweek(predict_date_day)  when 1 then '星期日' when 2 then '星期一' 
                            	   when 3 then '星期二' when 4 then '星期三' 
                                   when 5 then '星期四' when 6 then '星期五' 
                                   when 7 then '星期六' end                                 as week_day_name       -- 星期(星期几)
	   ,concat(year(predict_date_day),case when weekofyear(predict_date_day) < 10 then concat('0',(weekofyear(predict_date_day))) else weekofyear(predict_date_day) end)	as week_ofyearid -- 年周的id
	   ,weekofyear(predict_date_day)                                                                      as week_ofyear         -- 年周
	   ,concat(year(predict_date_day),'年第',weekofyear(predict_date_day),'周')                                         as week_ofyear_name    -- 年周名称
	   ,concat(date_add(predict_date_day,1 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end),
	   '~',date_add(predict_date_day,7 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end))  as week_ofyear_period  -- 年周段
	   ,concat(
	    regexp_replace(substr(split(concat(date_add(predict_date_day,1 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end),
	   '~',date_add(predict_date_day,7 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end)), '~') [0], 6, 5),'-','.'),
         '-',
        regexp_replace(substr(split(concat(date_add(predict_date_day,1 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end),
	   '~',date_add(predict_date_day,7 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end)), '~') [1], 6, 5),'-','.')
        )                                                                                   as week_ofyear_period_short     --年周段
	 --,dense_rank()over(partition by year(predict_date_day),month(predict_date_day) order by weekofyear(predict_date_day) asc)       as week_ofmonth        -- 月周
	 --,concat(month(predict_date_day),'月第',dense_rank()over(partition by year(predict_date_day),month(predict_date_day) order by weekofyear(predict_date_day) asc),'周') as week_ofmonth_name   -- 月周名称  
	   ,month(predict_date_day)                                                                           as month_code          -- 月(mm)
	   ,substr(regexp_replace(predict_date_day,'-','') ,1,6)                                              as yearmonth_id        -- 年月(yyyymm)
	   ,quarter(predict_date_day)                                                                         as quarter_id          -- 季度
       ,concat(year(predict_date_day),'Q',quarter(predict_date_day) )                                                   as quarter_code        -- 年季度
       ,year(predict_date_day)                                                                            as year_id             -- 年
       ,case when MONTH(predict_date_day) > 6 then 'f_half' else 'l_half' end                             as half_code           -- 半年
	   ,regexp_replace(date_add(predict_date_day,-1),'-','')                                             as last_date_id        -- 昨天
	   ,regexp_replace(date_add(predict_date_day,0 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end),'-','')      as last_sunday          -- 上个周日 1
	   ,regexp_replace(date_add(predict_date_day,0 - case when dayofweek(predict_date_day) = 1 then 14 else dayofweek(predict_date_day) + 6 end),'-','')     as L_last_sunday        -- 上上个周日 2 
       ,regexp_replace(date_add(predict_date_day,0 - case when dayofweek(predict_date_day) = 1 then 21 else dayofweek(predict_date_day) + 13 end),'-','')    as LL_last_sunday       -- 上上上个周日 3 
       ,regexp_replace(date_add(predict_date_day,0 - case when dayofweek(predict_date_day) = 1 then 28 else dayofweek(predict_date_day) + 20 end),'-','')    as LLL_last_sunday      -- 上上上上个周日 4
	   ,regexp_replace(date_add(trunc(predict_date_day,'MM'),-1),'-','')                                                         as lastday_of_lastmonth -- 上个月末
	   ,regexp_replace(date_add(trunc(predict_date_day,'YY'),-1),'-','')                                                         as lastday_oflastyear   -- 上个年末  
	   ,regexp_replace(date_add(predict_date_day,1 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end),'-','')      as firstday_ofweek      -- 当周第一天
	   ,regexp_replace(date_add(predict_date_day,7 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end),'-','')      as lastday_ofweek       -- 当周最后一天  
	   ,trunc(predict_date_day,'MM')															            as firstday_ofmonth    -- 当月第一天
	   ,last_day(predict_date_day)                                                                        as lastday_ofmonth     -- 当月最后一天
	   ,to_date(concat(year(predict_date_day),'-',lpad(ceil(month(predict_date_day)/3) * 3-2,2,0),'-01'))               as firstday_ofseason   -- 当季第一天
	   ,last_day(to_date(concat(year(predict_date_day),'-',lpad(ceil(month(predict_date_day)/3) * 3,2,0),'-01')))       as lastday_ofseason    -- 当季最后一天
	   ,trunc(predict_date_day,'YY')                                                                      as firstday_ofyear     -- 当年第一天
	   ,last_day(add_months(trunc(predict_date_day,'YY'),11))                                             as lastday_ofyear      -- 当年最后一天
   from(
         select
           date_add("2020-01-14", t.pos) as predict_date_day
         from(
             select
               posexplode(
                 split(
                   repeat(
                     "m",
                     --datediff(
                     --  date_sub(from_unixtime(unix_timestamp('21001231', 'yyyyMMdd')),-1),
                    --            from_unixtime(unix_timestamp('19000101', 'yyyyMMdd'),'yyyy-MM-dd')
                    -- )
					datediff("2030-01-13", "2020-01-14")
                   ),"m"
                 )
               )
           ) t
      ) T 
      )
	  
	  
	   --更新月周
      --[dim][房产业务][时间维表]dim_es_date_c_d 	   
	  -- insert overwrite  table  dim_es_date_c_d
       select 	   
	          M.date_id                                          --日(yyyymmdd)           
	         ,M.date_code                                        --日(yyyy-mm-dd)
	         ,M.date_name                                        --日(yyyy年mm月dd日)
             ,M.week_day_id                                      --周ID(周几)
	         ,M.week_day_name                                    --星期(星期几)
             ,N.week_ofyearid                                    --年周的id			 
	         ,M.week_ofyear                                      --年周               
	         ,N.week_ofyear_name                                 --年周名称 
	         ,M.week_ofyear_period                               --年周段     
	         ,M.week_ofyear_period_short                         --年周段简称 
			 ,N.month_code as  month_week_code                   --周所在月 
        --     ,dense_rank()over(partition by M.year_id,N.month_code order by M.week_ofyear asc)  as week_ofmonth                                       --月周
        	 ,dense_rank()over(partition by N.year_id,N.month_code order by N.week_ofyear asc)  as week_ofmonth                                       --月周
			 ,concat(N.month_code,'月第',dense_rank()over(partition by N.year_id,N.month_code order by N.week_ofyear asc),'周') as week_ofmonth_name  --月周名称
	         ,M.month_code                                       --月(mm)         
	         ,M.yearmonth_id                                     --年月(yyyymm)            
	         ,M.quarter_id                                       --季度              
	         ,M.quarter_code                                     --年季度            
	         ,M.year_id                                          --年                  
	         ,M.half_code                                        --半年
             ,M.last_date_id                                     --昨天
			 ,M.last_sunday                                      --上个周日
			 ,M.L_last_sunday                                    --上上个周日
             ,M.LL_last_sunday                                   --上上个周日
             ,M.LLL_last_sunday                                  --上上上个周日
			 ,M.lastday_of_lastmonth                             --上个月末
			 ,M.lastday_oflastyear                               --上个年末 	 
	         ,M.firstday_ofweek                                  --当周第一天          
	         ,M.lastday_ofweek                                   --当周最后一天           
	         ,M.firstday_ofmonth                                 --当月第一天          
	         ,M.lastday_ofmonth                                  --当月最后一天       
	         ,M.firstday_ofseason                                --当季第一天        
	         ,M.lastday_ofseason                                 --当季最后一天         
	         ,M.firstday_ofyear                                  --当年第一天          
	         ,M.lastday_ofyear                                   --当年最后一天 
             ,from_utc_timestamp(current_timestamp(),"GMT+8")  as last_update_time				 
        from  tmp_es_date_00 M
        left join 
		(
	    select  year_id
	           ,month_code        
	           ,week_ofyear
          	   ,week_ofyear_period
               ,week_ofyearid
               ,week_ofyear_name
	           ,count(date_id) day_cnt            
	    from  tmp_es_date_00
	    group by year_id
	            ,month_code        
	            ,week_ofyear
          		,week_ofyear_period
                ,week_ofyearid
                ,week_ofyear_name
	    having 	day_cnt >= 4
		) N                           -- 统计周所在月
	--	on M.year_id = N.year_id and M.week_ofyear = N.week_ofyear 
    	on M.week_ofyear_period = N.week_ofyear_period
    --    where M.date_id <= 	'${yyyyMMdd}'
		where M.date_code <=	date_add(from_unixtime(unix_timestamp('${yyyyMMdd}', 'yyyyMMdd'),'yyyy-MM-dd'),1)
	  ;
	  
	  
	  
	  --
	  CREATE TABLE `dim_es_date_c_d`(
`day_code` string COMMENT '',
`day_long_desc` string COMMENT '',
`day_medium_desc` string COMMENT '',
`day_short_desc` string COMMENT '',
`week_code` string COMMENT '',
`week_long_desc` string COMMENT '',
`week_medium_desc` string COMMENT '',
`week_short_desc` string COMMENT '',
`week_day` string COMMENT '',
`month_code` string COMMENT '',
`month_long_desc` string COMMENT '',
`month_medium_desc` string COMMENT '',
`month_short_desc` string COMMENT '',
`quarter_code` string COMMENT '',
`quarter_long_desc` string COMMENT '',
`quarter_medium_desc` string COMMENT '',
`quarter_short_desc` string COMMENT '',
`half_year_code` string COMMENT '',
`half_long_desc` string COMMENT '',
`half_medium_desc` string COMMENT '',
`half_short_desc` string COMMENT '',
`year_code` string COMMENT '',
`year_long_desc` string COMMENT '',
`year_medium_desc` string COMMENT '',
`year_short_desc` string COMMENT '',
`last_update_time` string COMMENT '')
COMMENT '时间维表'
Blink SQL 支持在(dimension table)和事实(fact table)之间进行 join 操作,以便在查询中使用的属性。通常包含静态数据,例如产品信息、客户信息等,而事实则包含动态数据,例如销售记录、订单记录等。 join 的语法如下: ```sql SELECT fact_table.*, dim_table.* FROM fact_table JOIN dim_table ON fact_table.dimension_column = dim_table.dimension_column ``` 其中,`fact_table` 是事实,`dim_table` 是,`dimension_column` 是两个中共同的度列。在 join 操作中,通过将度列作为 join 条件,将事实中的每一行与中匹配的行进行组合。这样,查询结果将包含事实的所有列。 举个例子,假设有一个事实 `sales_fact` 包含销售记录,和一个 `product_dim` 包含产品信息。如果我们想要查询某个时间范围内的销售记录,并且需要显示每个产品的名称和价格等信息,可以使用如下的 SQL 语句: ```sql SELECT sales_fact.*, product_dim.product_name, product_dim.price FROM sales_fact JOIN product_dim ON sales_fact.product_id = product_dim.product_id WHERE sales_fact.order_date BETWEEN '2022-01-01' AND '2022-01-31' ``` 在这个查询中,我们通过 `JOIN` 操作将事实 `sales_fact` 和 `product_dim` 进行了组合,并通过 `ON` 子句指定了度列 `product_id` 作为 join 条件。最终的查询结果将包含销售记录和产品信息的所有列,并限制了销售日期在 2022 年 1 月份的记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值