【问题标题】:Generate all quarters within a start date and end date生成开始日期和结束日期内的所有季度
【发布时间】:2017-06-09 00:22:00
【问题描述】:

我有一张包含不同广告系列的表格。每个广告系列都有一个开始日期和结束日期。

campaign id | start date | end date |

我想知道这些活动发生在哪个季度。

理想情况下,它应该是这样的——在那些四分之一列下,它会显示一个 0 和 1 的二进制变量。

account id | campaign id | start date | end date | 2015q1 | 2015q2 | 2015q3 |...etc

例如,如果活动在 2015 年 1 月 1 日至 2015 年 5 月 2 日期间发生,那么结果将是:

| 2015q1 | 2015q2 | 2015q3 |
| 1      | 1      | 0      |

我正在使用 Amazon Redshift。

【问题讨论】:

    标签: sql amazon-redshift


    【解决方案1】:

    将结果放入列时,您必须对值进行硬编码。比如这个输入数据:

    id, start_date,end_date
    1,2016-03-23,2016-07-18
    2,2016-01-01,2016-01-02
    3,2016-10-05,2016-11-05
    4,2016-01-01,2016-12-31
    

    使用此查询:

    SELECT
      id,
      start_date,
      end_date,
      (CASE WHEN start_date < '2016-04-01' AND end_date >= '2016-01-01' THEN 1 ELSE 0 END) as Q1_2016,
      (CASE WHEN start_date < '2016-07-01' AND end_date >= '2016-04-01' THEN 1 ELSE 0 END) as Q2_2016,
      (CASE WHEN start_date < '2016-10-01' AND end_date >= '2016-07-01' THEN 1 ELSE 0 END) as Q3_2016,
      (CASE WHEN start_date < '2017-01-01' AND end_date >= '2016-10-01' THEN 1 ELSE 0 END) as Q4_2016
    FROM campaign
    

    给出这个结果:

    1   2016-03-23  2016-07-18  1   1   1   0
    2   2016-01-01  2016-01-02  1   0   0   0
    3   2016-10-05  2016-11-05  0   0   0   1
    4   2016-01-01  2016-12-31  1   1   1   1
    

    很遗憾,没有可以为您自动创建列的 SQL 技巧。

    【讨论】:

      【解决方案2】:

      你可以使用如下extract(Quarter from date)函数:

      SELECT
         campaign_id,
         case when start_quarter=1 and start_year=2015 then 1 else 0 end as q1_2015,
         case when start_quarter=2 and start_year=2015 then 1 else 0 end as q2_2015,
         case when start_quarter=3 and start_year=2015 then 1 else 0 end as q3_2015,
         case when start_quarter=4 and start_year=2015 then 1 else 0 end as q4_2015
      FROM (
        SELECT
          campaign_id,
          extract(MONTH FROM start_date) AS start_month,
          extract(YEAR FROM start_date)  AS start_year,
          extract(QUARTER from start_date) as start_quarter,
          extract(MONTH FROM end_date)   AS end_month,
          extract(YEAR FROM end_date)    AS end_year,
          extract(QUARTER FROM end_date) AS end_quarter
        FROM table
      ) t1
      

      或者,如果您更喜欢没有硬编码的选项,您可以简单地使用子查询。

      SELECT
          campaign_id,
          extract(MONTH FROM start_date) AS start_month,
          extract(YEAR FROM start_date)  AS start_year,
          extract(QUARTER from start_date) as start_quarter,
          extract(MONTH FROM end_date)   AS end_month,
          extract(YEAR FROM end_date)    AS end_year,
          extract(QUARTER FROM end_date) AS end_quarter
        FROM table
      

      此选项将为您提供如下结果:

      campaing_id start month start year  start quarter   end month   end year    end quarter
          4   2015    2   4   2015    2
          3   2017    1   3   2017    1
          2   2015    1   3   2015    1
          12  2014    4   12  2014    4
          2   2017    1   2   2017    1
          7   2016    3   8   2016    3
      

      【讨论】:

        猜你喜欢
        • 2021-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-06
        • 1970-01-01
        • 2020-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多