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