【问题标题】:Split up by specific time period (Such as: split up data by last 2-3 months ...4-5 months, 6-7 months)按特定时间段拆分(如:按过去 2-3 个月拆分数据 ...4-5 个月、6-7 个月)
【发布时间】:2021-12-28 18:31:05
【问题描述】:

我有一个简单的问题,我不知道我在哪里做错了。我真的很感谢你的帮助。提前感谢您的任何提示。

我有数据,需要将发布日期拆分为 1 个月、2-3 个月、4-5 个月、6-7 个月、7-9 个月等。 所以,我创建了一个查询;

Select    case
          when release_date >= current_date - interval '1 month' then 'Within 1 month'
          when release_date between (current_date - interval '2 months') and (current_date - interval '3 months') then '2-3 months'
          when release_date between (current_date - interval '4 months') and (current_date - interval '5 months') then '4-5 months'
          when release_date between (current_date - interval '6 months') and (current_date - interval '7 months') then '6-7 months'
          when release_date between (current_date - interval '8 months') and (current_date - interval '9 months') then '8-9 months'
          when release_date between (current_date - interval '10 months') and (current_date - interval '12 months') then '9-12 months'
          when release_date < current_date - interval '12 months' then '> 12 month'
          end as release_date,
          country,
          ....

最后我只能看到1个月内NULL>12个月

【问题讨论】:

  • 您使用的是哪个 dbms?

标签: sql date split intervals


【解决方案1】:

我认为您的输出正在生成“月”以外的计算。答案取决于您使用的 dbms。这是在 postgres 中执行的一种方法,但如果您使用另一个 dbms,那么您应该能够轻松更改 CTE 中计算月份的语法。使用 CTE 可以让您有一个干净的案例陈述。

    with calculated_months as
    (
      select release_date,  
      extract(year from age(current_date, release_date)) * 12
       + extract(month from age(current_date, release_date))
       + 1   as months_from_current
    from t1
    )
    select t.release_date, 
    case
        when c.months_from_current < 2 then 'Within 1 month'
        when c.months_from_current between 2 and 3 then '2-3 months'
        when c.months_from_current between 4 and 5 then '4-5 months'
        when c.months_from_current between 6 and 7 then '6-7 months'
        when c.months_from_current between 8 and 9 then '8-9 months'
        when c.months_from_current between 10 and 12 then '10-12 months'
        when c.months_from_current > 12 then '12+ months'
    end months_since_release,
    t.country
    from t1 t
    join calculated_months c
      on c.release_date = t.release_date

db-fiddle here

编辑:不确定您的数据如何显示,但您可能希望在 CTE 中添加“不同”(选择不同的发布日期...)。

【讨论】:

    【解决方案2】:

    如果我正确阅读了您的查询,则需要交换“介于”语句中的值:

    Select    case
              when release_date >= current_date - interval '1 month' then 'Within 1 month'
              when release_date between (current_date - interval '3 months') and (current_date - interval '2 months') then '2-3 months'
              when release_date between (current_date - interval '5 months') and (current_date - interval '4 months') then '4-5 months'
              when release_date between (current_date - interval '7 months') and (current_date - interval '6 months') then '6-7 months'
              when release_date between (current_date - interval '9 months') and (current_date - interval '8 months') then '8-9 months'
              when release_date between (current_date - interval '12 months') and (current_date - interval '9 months') then '9-12 months'
              when release_date < current_date - interval '12 months' then '> 12 month'
              end as release_date,
              country,
    

    我没有系统可以运行它来确认,但它应该可以工作。

    问题在于between 的工作原理,BETWEEN (lower_limit) AND (upper_limit)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-29
      • 2019-05-20
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多