1

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

首先,我按日期降序排列所有记录,如下所示。然后,我想用 1 或 0 标记每个组“A”行。对于所有“A”行,如果前一条记录(日期较早)=“B”行,那么我想标记 1。否则标记 a 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

我怎样才能做到这一点?这比查询更简单!

4

2 回答 2

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
于 2013-02-22T22:31:51.357 回答
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 与演示

于 2013-02-22T22:33:34.880 回答