MYSQL从星期六开始,以每月的零开始获取每月的一周

时间:2020-06-25 09:46:01

标签: mysql sql date conditional-statements

我有一个非常复杂的查询,需要帮助。 我有一个包含Order_IDDateDay的表。

我需要获取每月Week_No的星期。此字段有4个关键条件。

  1. 一周从星期六开始,在每个月初重新开始。
  2. 结果的总长度应为3个字符,因此应始终有2个前导零,例如001
  3. Week_No将始终从001开始,即使没有其他条目导致该条目的特定Date
  4. Week_No始终以1递增,即使一个月的特定星期没有订单。

举例说明条件3和4。,

如果6月份的订单只有2个,分别是2020-06-29和1 2020-06-11,则Week_No将是002和{{1 }},分别用于前者和后者。

希望我的下表足够清楚。

001

1 个答案:

答案 0 :(得分:1)

嗯。 。 。您实际上可以利用潜在客户和累计金额来完成此操作。逻辑基本上是:

  • 如果以前的日期是同一个月,并且在之间有一个星期六,则添加1。
  • 从1开始,表示该月的第一个日期。

逻辑如下:

  select t.*,
         sum(case when extract(year_month from date) <> extract(year_month from prev_date) or prev_date is null
                  then 1
                  when datediff(date, prev_date) >= 7
                  then 1
                  when day = 'Fri' or
                       day = 'Thu' and prev_day not in ('Fri') or
                       day = 'Wed' and prev_day not in ('Fri', 'Thu') or
                       day = 'Tue' and prev_day not in ('Fri', 'Thu', 'Wed') or
                       day = 'Mon' and prev_day not in ('Fri', 'Thu', 'Wed', 'Tue') or
                       day = 'Sun' and prev_day not in ('Fri', 'Thu', 'Wed', 'Tue', 'Mon') 
                  then 0
                  else 1
             end) over (order by date) as week_num

  from (select t.*,
               lag(date) over (order by date) as prev_date,
               lag(day) over (order by day) as prev_day
        from t
       ) t
相关问题