【问题标题】:How to calculate the difference in days based on what is found in different date columns如何根据不同日期列中的内容计算天数差异
【发布时间】:2021-12-31 16:30:40
【问题描述】:

我有一个表,它的日期时间对应于不同的状态:为每个用户点击、认领和购买。

我折叠了每个用户的记录,并将每个状态对应的每个日期时间放在他们自己的列中:clicked_date、claim_date和buy_date。我也有一个截止日期。

现在我需要另一个列来计算截止日期的天数。新列(number_days)应该总是减去deadline_date 减去clicked_date。但是,如果 clicked_date 设置为“2999-12-31”,那么它应该减去deadline_date 减去claim_date。如果clicked_date 设置为“2999-12-31”并且claimed_date 设置为=“299-12-31”,那么它应该减去截止日期减去购买日期。如果 clicked_date 设置为“2999-12-31”,claim_date 设置为“2999-12-31”,buy_date 设置为“2999-12-31”或deadline_date = '/N',那么它应该为0。

In the examples above,
The first record should be (deadline_date - bought_date)
The second record should be (deadline_date - clicked_date) 
The third record should be 0.
The fourth record should be (deadline_date - claimed_date)
The fifth record should be (deadline_date - claimed_date) 
The fifth record should be (deadline_date - clicked_date) 

我无法制定此查询。有谁知道我如何根据点击、认领和购买的三个不同日期列中的每一个来计算天数?

我尝试了类似的方法,但它不起作用:

select 
user,
(array_agg(STATUS) within group(order by UPDATED_AT_DATETIME desc)[0])::varchar as last_status,
   coalesce(max(case when STATUS = 'clicked'  THEN UPDATED_AT_DATETIME END),'2999-12-31'::datetime) as clicked_date,
   coalesce(max(case when STATUS = 'claimed'   THEN UPDATED_AT_DATETIME END),'2999-12-31'::datetime) as claimed_date,
   coalesce(max(case when STATUS = 'bought' THEN ACCOUNT_REWARD_UPDATED_AT_DATETIME END),'2999-12-31'::datetime) as bought_date,
   **case when CLICKED_DATE <> '2999-12-31 00:00:00.000' then DATEDIFF('days', TRY_TO_TIMESTAMP(clicked_date) ,TRY_TO_TIMESTAMP(DEADLINE_DATETIME))
   when claimed_date <> '2999-12-31 00:00:00.000' then DATEDIFF('days', TRY_TO_TIMESTAMP(claimed_date) ,TRY_TO_TIMESTAMP(DEADLINE_DATETIME))
   when bought_date <> '2999-12-31 00:00:00.000' then DATEDIFF('days', TRY_TO_TIMESTAMP(bought_date) ,TRY_TO_TIMESTAMP(DEADLINE_DATETIME))
   END as number_days**
from TBL_A a
group by 1,2

【问题讨论】:

    标签: sql snowflake-cloud-data-platform snowflake-schema


    【解决方案1】:

    这些规则也可以直接写成这样:

    SELECT 
        clicked_date,
        claimed_date,
        bought_date,
        deadline_date,
        CASE
            WHEN clicked_date != "2999-12-31" THEN datediff(day,deadline_date,  clicked_date)
            WHEN clicked_date = "2999-12-31" THEN datediff(day, deadline_date, claimed_date)
            WHEN clicked_date = "2999-12-31" AND claimed_date = "2999-12-31" THEN datediff(day, deadline_date, bought_date)
            WHEN clicked_date = "2999-12-31" AND claimed_date = "2999-12-31" AND bought_date = "2999-12-31" THEN 0
            WHEN deadline_date = "/N" THEN 0
        END AS number_days
    FROM table;
    

    但是,第 3 条和第 4 条规则对第 2 条规则的限制更大,因此需要放在前面以便它们触发,因此您想要的代码是这样的:

    SELECT 
        clicked_date,
        claimed_date,
        bought_date,
        deadline_date,
        CASE
            WHEN clicked_date != "2999-12-31" THEN datediff(day,deadline_date,  clicked_date)
            WHEN clicked_date = "2999-12-31" AND claimed_date = "2999-12-31" AND bought_date = "2999-12-31" THEN 0
            WHEN clicked_date = "2999-12-31" AND claimed_date = "2999-12-31" THEN datediff(day, deadline_date, bought_date)
            WHEN clicked_date = "2999-12-31" THEN datediff(day, deadline_date, claimed_date)
            WHEN deadline_date = "/N" THEN 0
        END AS number_days
    FROM table;
    

    或者,如果您想明确表达,可以加入排除:

    SELECT 
        clicked_date,
        claimed_date,
        bought_date,
        deadline_date,
        CASE
            WHEN clicked_date != "2999-12-31" 
                THEN datediff(day,deadline_date,  clicked_date)
            WHEN clicked_date = "2999-12-31" AND claimed_date != "2999-12-31" AND bought_date != "2999-12-31" 
                THEN datediff(day, deadline_date, claimed_date)
            WHEN clicked_date = "2999-12-31" AND claimed_date = "2999-12-31" AND bought_date != "2999-12-31" 
                THEN datediff(day, deadline_date, bought_date)
            WHEN clicked_date = "2999-12-31" AND claimed_date = "2999-12-31" AND bought_date = "2999-12-31" 
                THEN 0
            WHEN deadline_date = "/N" 
                THEN 0
        END AS number_days
    FROM table;
    

    现在,如果您的“日期”是 DATES,则上述方法将起作用,但如果它们只是字符串,正如“/N”所暗示的那样,您将需要将这些字符串转换/解析为日期。喜欢:

    SELECT 
        clicked_date,
        claimed_date,
        bought_date,
        deadline_date,
        CASE
            WHEN clicked_date != "2999-12-31" 
                THEN datediff(day,deadline_date::date,  clicked_date::date)
            WHEN clicked_date = "2999-12-31" AND claimed_date != "2999-12-31" AND bought_date != "2999-12-31" 
                THEN datediff(day, deadline_date::date, claimed_date::date)
            WHEN clicked_date = "2999-12-31" AND claimed_date = "2999-12-31" AND bought_date != "2999-12-31" 
                THEN datediff(day, deadline_date::date, bought_date::date)
            WHEN clicked_date = "2999-12-31" AND claimed_date = "2999-12-31" AND bought_date = "2999-12-31" 
                THEN 0
            WHEN deadline_date = "/N" 
                THEN 0
        END AS number_days
    FROM table;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-29
      • 2013-09-21
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 2019-08-24
      • 2020-08-13
      • 1970-01-01
      相关资源
      最近更新 更多