我有一个名为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
我该怎么做?这比描述更容易描述!
答案 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