为最后发生的密钥保留月份的差异值

时间:2014-11-10 11:59:43

标签: sql

我有这样的数据集:

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

在每个月中,它会查找该密钥的最后一个值,并且无论在哪个月找到该值,它都将保持差异值。

2 个答案:

答案 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