SQL自上次不可用的天数

SQL自上次不可用的天数,sql,amazon-redshift,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 在这里,日期和产品id的组合是唯一的。我需要有一个第四栏:

我有一个带有以下示例的表redshift db:

product_id | date    | is_unavailable 
1          | 1st Jan | 1              
1          | 2nd Jan | 0              
1          | 3rd Jan | 0              
1          | 4rd Jan | 1              
在这里,日期和产品id的组合是唯一的。我需要有一个第四栏:自上次不可用的天数

以下是所需的输出:

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
我曾想过使用带有分区的滞后窗口函数覆盖产品标识,但是,这里必须检查不可用标识的附加条件,这是我在查询中无法适应的

选择*, 日期滞后按产品划分的日期\u id按日期排序的订单 自上次不可用起的天数 从mytable 按产品编号排序的订单


但是,我不知道如何使用unavailable_flag,因为需要找到unavailable_flag=1的最后日期,没有延迟,但在一个案例中有一个简单的最大值:

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

    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

不清楚的。请标记您正在使用的数据库,包括您的查询,以及示例输入/输出数据。您能显示到目前为止得到的查询吗?请显示表的示例数据和预期输出。问题明确指定了红移,因此我交换了标记。谢谢Dnoeth。我尝试了您的查询:选择product\u id,maxcase when unavailable\u flag=1,然后按product\u id按分区结束日期,作为days\u sice\u last\u unavailable,date from mytable;但是最后一次不可用的日子是空的。@Ankittripati:空的?这是不可能的,除非标志从未设置为1。我将修改我的答案以匹配您的新描述。嗨,Dnoeth,我限制了没有显示完整图片的行。以下是使用您的解决方案的完整查询:选择product_id、date、is_unavailable、DATEDIFFd、maxcase when is_unavailable=1,然后选择date end-上一个不可用日期(按product_id划分)按日期排序(按日期行无限制的前一行),日期为最后一天,tmp无法提供谢谢:。谢谢Sahi。但是,查询会继续计算从第一个中断日期算起的天数差异,而不是从最后一个中断日期算起的天数差异。对于以下数据:在tmp选择1、'2018-01-01',1联合选择1,'2018-01-02',0联合选择1,'2018-01-03',0联合选择1,'2018-01-04',1联合选择1,'2018-01-05',0联合选择1,'2018-01-06',0输出为:0,1,2,0,4,5,而不是0,1,2,0,1,2