2013-02-22 59 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 
相关问题