【问题标题】:Derive a 4-week period column from week column从周列派生一个 4 周期间列
【发布时间】:2020-01-15 00:23:32
【问题描述】:

我的 SQL 表中有一个汇总的每周数据。日期列是每周的星期一,如下所示:

date
2019-11-25
2019-11-18
2019-11-11
2019-11-04
2019-10-28
2019-10-21
2019-10-14
2019-10-07
2019-09-30
..........

我需要的是两个派生列 periodId1,2,3,...period 定义日期范围像 2019-11-04:2019-11-25

date      periodId  period
2019-11-25    1    2019-11-04:2019-11-25
2019-11-18    1    2019-11-04:2019-11-25
2019-11-11    1    2019-11-04:2019-11-25
2019-11-04    1    2019-11-04:2019-11-25
2019-10-28    2    2019-10-07:2019-10-28
2019-10-21    2    2019-10-07:2019-10-28
2019-10-14    2    2019-10-07:2019-10-28
2019-10-07    2    2019-10-07:2019-10-28
2019-09-30    3    ................
..........

如何在 SQL 中执行此操作,或者是否可以在 SQL 中进行此类操作?我在 SQL Server 中。

【问题讨论】:

  • date 列是日期数据类型还是字符串?

标签: sql sql-server tsql date


【解决方案1】:

您可以使用row_number() 生成 4 条连续记录的组,从最新的一条开始。然后,您可以对组执行窗口min()s 和max()s:

select
    date,
    periodId,
    concat(
        cast(min(date) over(partition by periodId) as varchar),
        ':',
        cast(max(date) over(partition by periodId) as varchar)
    ) period
from (
    select date, (row_number() over(order by date desc) + 3) / 4 periodId       
    from mytable 
) t 

这假定datedate 数据类型。如果是yyymmdd格式的字符串,则不需要cast()

select
    date,
    periodId,
    concat(
        min(date) over(partition by periodId),
        ':',
        max(date) over(partition by periodId)
    ) period    
from (
    select date, (row_number() over(order by date desc) + 3) / 4 periodId       
    from mytable 
) t 

Demo on DB Fiddle

日期 |周期ID |时期 :--------- | :------- | :-------------------- 2019-11-25 | 1 | 2019-11-04:2019-11-25 2019-11-18 | 1 | 2019-11-04:2019-11-25 2019-11-11 | 1 | 2019-11-04:2019-11-25 2019-11-04 | 1 | 2019-11-04:2019-11-25 2019-10-28 | 2 | 2019-10-07:2019-10-28 2019-10-21 | 2 | 2019-10-07:2019-10-28 2019-10-14 | 2 | 2019-10-07:2019-10-28 2019-10-07 | 2 | 2019-10-07:2019-10-28 2019-09-30 | 3 | 2019-09-30:2019-09-30

【讨论】:

    【解决方案2】:

    如果您愿意,也可以不使用子查询:

    select date,
           row_number() over (order by date) + 3 as period,
           concat(convert(varchar(10), 
                          dateadd(week, row_number() over (order by date) - 1, date)
                         ),
                  ':',
                  convert(varchar(10), 
                          dateadd(week, row_number() over (order by date) + 3, date)
                         )
                 ) as dates
    from t;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2018-05-02
      • 2020-01-02
      • 2015-02-19
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多