Lag() with condition in sql server

后端 未结 3 1876
南旧
南旧 2020-12-15 08:24

i have a table like this:

Number   Price    Type       Date         Time
------   -----    ----    ----------    ---------
23456    0,665     SV     2014/02/         


        
3条回答
  •  醉梦人生
    2020-12-15 08:50

    Yes, you can use LEAD/LAG. You just need to precalculate how far to jump with a little ROW_NUMBER() magic.

    DECLARE @a TABLE ( number int, price money, type varchar(2),
                       date date, time time)
    INSERT @a VALUES
    (23456,0.665,'SV','2014/02/02','08:00:02'),
    (23457,1.3  ,'EC','2014/02/02','07:50:45'),
    (23658,2.4  ,'EC','2014/02/02','07:50:45'),
    (23660,2.4  ,'EC','2014/02/02','07:50:48'),
    (23465,0.668,'SV','2014/02/02','07:36:34');
    
    ; WITH a AS (
         SELECT *,
                ROW_NUMBER() OVER(ORDER BY [date] DESC, [time] DESC) x, 
                ROW_NUMBER() OVER(PARTITION BY 
                   CASE [type] WHEN 'SV' THEN 1 ELSE 0 END 
                   ORDER BY [date] DESC, [time] DESC) y 
         FROM @a)
     , b AS (
         SELECT *,
                ROW_NUMBER() OVER(PARTITION BY x-y ORDER BY x ASC) z1,
                ROW_NUMBER() OVER(PARTITION BY x-y ORDER BY x DESC) z2 
         FROM a)
    SELECT *,
           CASE [type] WHEN 'SV' THEN 
               LAG(price,z1,price) OVER(PARTITION BY [type] ORDER BY x) 
               ELSE LAG(price,z1,price) OVER(ORDER BY x) 
               END,
           CASE [type] WHEN 'SV' THEN 
               LEAD(price,z2,price) OVER(PARTITION BY [type] ORDER BY x) 
               ELSE LEAD(price,z2,price) OVER(ORDER BY x) 
               END
    FROM b
    ORDER BY x
    

提交回复
热议问题