如何匹配两个不同组的记录?

时间:2013-02-22 22:22:01

标签: tsql ssrs-2008 grouping

我有一个名为Event_log的主表,其中包含此查询所需的所有记录。在这个表中有一列我称之为“Grp”。为简化起见,假设此Grp只有两个可能的值:A和B.所以现在我们有一个表,Event_log,一列“Grp”和另一个名为“Actual Date”的列。最后,我想在此表中添加一个Flag列,其工作方式如下。

首先,我按日期按降序排列所有记录,如下所示。然后,我想用1或0标记每个组“A”行。对于所有“A”行,如果前一个记录(日期早些时候)=“B”行,那么我想标记1.否则标记a因此,在设置此标志之前,此初始表如下所示:

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

答案 0 :(得分: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

答案 1 :(得分: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