我有一个表(redshift db),其中包含以下示例:
product_id | date | is_unavailable
1 | 1st Jan | 1
1 | 2nd Jan | 0
1 | 3rd Jan | 0
1 | 4rd Jan | 1
此处,date
和product_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找到最后一个日期
答案 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