我有这样的数据集:
Month Key
1 x
1 y
1 z
2 y
2 z
3 x
3 y
我想要一个这样的数据集:
Month Key Last_occured_before_month
1 x 0
1 y 0
1 z 0
2 y 0
2 z 0
3 x 1
3 y 0
在每个月中,它会查找该密钥的最后一个值,并且无论在哪个月找到该值,它都将保持差异值。
答案 0 :(得分:1)
大多数数据库都支持ANSI标准lag()
功能。我认为以下是您想要的:
select month, key,
coalesce(month - lag(month) over (partition by key order by month) - 1, 0
) as Last_occured_before_month
from table t;
我确实发现-1好奇。为什么最后一行是3-y-0而不是3-y-1?但是,这似乎是您正在使用的逻辑。
答案 1 :(得分:1)
您可以使用MAX:
SELECT Month, Key, NVL((
SELECT mytable.Month - MAX(t2.Month) - 1
FROM mytable t2
WHERE t2.Key = mytable.Key
AND t2.Month < mytable.Month), 0) AS Last_occured_before_month
FROM mytable