2013-02-22 51 views
1

我有一個名爲Event_log的主表,其中包含我需要查詢的所有記錄。在這個表格中有一列我稱之爲「Grp」。爲了簡化,假設這個Grp只有兩個可能的值:A和B.現在我們有一個表Event_log,其中一列爲「Grp」,另一列爲「實際日期」。最後,我想在此表中添加一個Flag列,其工作方式如下。如何匹配兩個不同組的記錄?

首先,我按日期降序排列所有記錄,如下所示。然後,我想用1或者0標記每個組「A」行。對於所有的「A」行,如果前一個記錄(日期早)=「B」行,那麼我想標記1。 0,所以這個最初的表看起來像這樣設置該標誌前:

Actual Date   Grp   Flag 
1-29-13    A 
12-27-12   B 
12-26-12   B 
12-23-12   A 
12-22-12   A 

但這些計算完成後,它應該是這樣的:

Actual Date   Grp   Flag 
1-29-13    A    1 
12-27-12   B    NULL 
12-26-12   B    NULL 
12-23-12   A    0 
12-22-12   A    0 

我怎樣才能做到這一點?描述起來比查詢更簡單!

回答

2

您可以使用類似:

select el.ActualDate 
    , el.Grp 
    , Flag = case 
    when el.grp = 'B' then null 
    when prev.grp = 'B' then 1 
    else 0 
    end 
from Event_log el 
    outer apply 
    (
    select top 1 prev.grp 
    from Event_log prev 
    where el.ActualDate > prev.ActualDate 
    order by prev.ActualDate desc 
) prev 
order by el.ActualDate desc 

SQL Fiddle with demo

+1

這是一些非常甜蜜的代碼!謝謝,伊恩。 – salvationishere 2013-02-25 22:20:38

2

試試這個

;with cte as 
(

    SELECT CAST('01-29-13' As DateTime) ActualDate,'A' Grp 
    UNION ALL SELECT '12-27-12','B' 
    UNION ALL SELECT '12-26-12','B' 
    UNION ALL SELECT '12-23-12','A' 
    UNION ALL SELECT '12-22-12','A' 
) 
, CTE2 as 
(
    SELECT *, ROW_NUMBER() OVER (order by actualdate desc) rn 
    FROM cte 
) 
SELECT a.*, 
case 
when A.Grp = 'A' THEN 
     CASE WHEN b.Grp = 'B' THEN 1 ELSE 0 END 
ELSE NULL 
END Flag 
from cte2 a 
LEFT OUTER JOIN CTE2 b on a.rn + 1 = b.rn 
相關問題