【问题标题】:How to calculate datediff with certain conditions?如何在某些条件下计算 datediff?
【发布时间】:2021-12-31 17:20:29
【问题描述】:

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

我折叠了每个用户的记录,并将每个状态对应的每个日期时间放在他们自己的列中: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 sixth 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 
        user,
        FIRST_VALUE(status) OVER (PARITION BY user ORDER BY updated_at_datetime DESC) AS last_status,
        MAX(IFF(status = 'clicked', UPDATED_AT_DATETIME, null)) AS clicked_date,
        MAX(IFF(status = 'claimed', UPDATED_AT_DATETIME, null)) AS claimed_date,
        MAX(IFF(status = 'bought', UPDATED_AT_DATETIME, null)) AS bought_date,
        COALESCE(bought_date, claimed_date, clicked_date, '2999-12-31'::datetime) as date_of_interest,
        DATEDIFF('days', date_of_interest, deadline_datetime) AS number_days
    FROM tbl_a AS a
    GROUP BY 1,2;
    

    如果它们确实已经是字符串,则可能需要像在示例中那样转换“日期”。

    “date_of_interest”可以内联。 MAX 和 COALESCE 不太可能发挥得很好,以防万一,就像子句一样:

    SELECT a.*
        COALESCE(bought_date, claimed_date, clicked_date, '2999-12-31'::datetime) as date_of_interest,
        DATEDIFF('days', date_of_interest, deadline_datetime) AS number_days
    FROM (
        SELECT 
            user,
            FIRST_VALUE(status) OVER (PARITION BY user ORDER BY updated_at_datetime DESC) AS last_status,
            MAX(IFF(status = 'clicked', UPDATED_AT_DATETIME, null)) AS clicked_date,
            MAX(IFF(status = 'claimed', UPDATED_AT_DATETIME, null)) AS claimed_date,
            MAX(IFF(status = 'bought', UPDATED_AT_DATETIME, null)) AS bought_date
        FROM tbl_a AS a
        GROUP BY 1,2
    ) AS a;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 2022-11-03
      • 2018-06-29
      • 2017-05-01
      相关资源
      最近更新 更多