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

Tsql 如何匹配两个不同组的记录?,tsql,ssrs-2008,grouping,Tsql,Ssrs 2008,Grouping,我有一个名为Event_log的主表,其中包含我进行此查询所需的所有记录。在这个表中有一列我称之为“Grp”。为了简化事情,假设这个Grp只有两个可能的值:A和B。所以现在我们有一个表Event_log,一列为“Grp”,另一列为“Actual Date”。最后,我想在此表中再添加一个标志列,其工作方式如下 首先,我按日期降序排列所有记录,如下所示。然后,我想用1或0标记每个组的“A”行。对于所有“A”行,如果上一条记录(日期较早)=“B”行,则我希望标记1。否则,将标记为0。因此,在设置此标志

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

首先,我按日期降序排列所有记录,如下所示。然后,我想用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
我该怎么做?这比查询更容易描述

试试这个

;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
试试这个

;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

您可以使用以下内容:

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

.

您可以使用以下内容:

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