【问题标题】:Start week number from given date从给定日期开始的周数
【发布时间】:2021-10-09 03:07:00
【问题描述】:

假设我们有一个存储客户数据的表。鉴于一周包含 7 天,我渴望能够分别在每个客户的 create_date 之后从 1 开始 周计数 第二天。之后,将 cust_purchase_date 存储在适当的 week_number 中。

每个客户的周数细分应该不同

 cust_id       create_date      cust_purchase_date     purchase_amount  
  111          7/5/2021            7/6/2021              85.00      
  111          7/5/2021            7/8/2021              25.00      
  111          7/5/2021            7/15/2021             35.00      
  111          7/5/2021            7/25/2021             15.00      
  222          7/9/2021            7/10/2021             10.00      
  222          7/9/2021            7/18/2021             25.00      
  222          7/9/2021            7/25/2021             31.00      
  222          7/9/2021            7/27/2021             41.00      
  333          7/11/2021           7/15/2021             51.00      
  333          7/11/2021           7/21/2021             65.00      
  444          7/15/2021           7/16/2021             100.00     
  444          7/15/2021           7/24/2021             78.00      
  444          7/15/2021           7/30/2021             87.00      
  555          8/20/2021           8/24/2021             71.00      
  555          8/20/2021           8/30/2021             55.00      
  555          8/20/2021           9/3/2021              36.00      
  555          8/20/2021           9/8/2021              25.00      

日期表(模拟):

cust_id  create_date  Wk 1 Start    Wk 1 End     Wk 2 Start   Wk 2 End    Wk 3 Start  Wk 3 End....
 111      7/5/2021     7/6/2021     7/12/2021    7/13/2021    7/19/2021   7/20/2021   7/26/2021...
 222      7/9/2021     7/10/2021    7/16/2021    7/17/2021    7/23/2021   7/24/2021   7/30/2021...
 333      7/11/2021    7/12/2021    7/18/2021    7/19/2021    7/25/2021   7/26/2021   8/1/2021...
 444      7/15/2021    7/16/2021    7/22/2021    7/23/2021    7/29/2021   7/30/2021   8/5/2021...
 555      8/20/2021    8/21/2021    8/27/2021    8/28/2021    9/3/2021    9/4/2021    9/10/2021...

请求:

cust_id       create_date      cust_purchase_date     purchase_amount    week_number            
  111          7/5/2021            7/6/2021              85.00               1
  111          7/5/2021            7/8/2021              25.00               1
  111          7/5/2021            7/15/2021             35.00               2
  111          7/5/2021            7/25/2021             15.00               3
  222          7/9/2021            7/10/2021             10.00               1
  222          7/9/2021            7/18/2021             25.00               2
  222          7/9/2021            7/25/2021             31.00               3
  222          7/9/2021            7/27/2021             41.00               3
  333          7/11/2021           7/15/2021             51.00               1
  333          7/11/2021           7/21/2021             65.00               2
  444          7/15/2021           7/16/2021             100.00              1
  444          7/15/2021           7/24/2021             78.00               2
  444          7/15/2021           7/30/2021             87.00               3
  555          8/20/2021           8/24/2021             71.00               1
  555          8/20/2021           8/30/2021             55.00               2
  555          8/20/2021           9/3/2021              36.00               3
  555          8/20/2021           9/8/2021              25.00               3

【问题讨论】:

  • 以天为单位的日期差异,整数除以七。

标签: sql postgresql


【解决方案1】:

你可以使用

select abs('7/5/2020'::DATE - '7/15/2021'::DATE) / 7 as weeks;
 weeks 
-------
    53

使用 abs() 所以日期顺序无关紧要。

【讨论】:

  • 你确定日期跨越不同年份时有效吗?
  • 不,它只会提取周数。
  • 那就不行了;)
  • 我认为 Belayers 的答案可能是您所需要的。 :-) 提取(购买日期 - 创建日期)/ 7.
【解决方案2】:

我不知道您的 date_table 的用途,但它似乎试图为每个客户预先确定周数,并为每周提供一列。这种方法的问题是您要为多少周生成列?当客户在create_date 之后 5 年(或更长时间)购买时会发生什么。 没有必要。 Postgres 允许date subtraction 以整数形式给出天数。由于您的“一周包含 7 天”,因此简单的除法给出了一周。 (见demo)。

select cust_id         
     , create_date   
     , purchase_date  
     , amount 
     , (purchase_date - create_date)/7 + 1 week_num
  from customer_purchases;     

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多