自上次无法使用的SQL天数

时间:2018-03-19 06:38:28

标签: sql amazon-redshift

我有一个表(redshift db),其中包含以下示例:

product_id | date    | is_unavailable 
1          | 1st Jan | 1              
1          | 2nd Jan | 0              
1          | 3rd Jan | 0              
1          | 4rd Jan | 1              

此处,dateproduct_id的组合为unique。我需要第4列:"自上次无法使用后的天数#34;

以下是所需的输出:

product_id | date    | is_unavailable | days_since_last_unavailable
    1      | 1st Jan | 1              |          -            
    1      | 2nd Jan | 0              |          1          
    1      | 3rd Jan | 0              |          2           
    1      | 4rd Jan | 1              |          0

我考虑过将lag窗口函数与partition over product_id一起使用,但是,此处必须检查unavailable_flag的附加条件,这是我在查询中无法容纳的。

选择*,     日期滞后(日期)结束(按产品顺序按日期排序)     as days_since_last_unavailbale 来自mytable 按product_id排序

但是,我无法弄清楚如何使用unavailable_flag,因为需要使用unavailable_flag = 1找到最后一个日期

2 个答案:

答案 0 :(得分:1)

没有LAG,但在CASE上只是一个简单的MAX:

max(case when is_unavailable = 1 then date end) -- previous unavailable date
over (partition by product_id
      order by date
      rows unbounded preceding)

答案 1 :(得分:0)

试试这个:

    create table #tmp (product_id INT,[date] DATETIME ,is_unavailable BIT)

    INSERT INTO #tmp
    SELECT 1,'2018-01-01',1
    union
    SELECT 1,'2018-01-02',0
    union
    SELECT 1,'2018-01-03',0
    union
    SELECT 1,'2018-01-04',1


    select product_id, date ,is_unavailable,
        DATEDIFF(d,
                CASE WHEN is_unavailable = 1 THEN date
                ELSE
                    MIN(case when is_unavailable = 1 then date end) over (partition by product_id) END,
                date) as days_sice_last_unavailable 

    FROM #tmp

    drop table #tmp