1

このクエリに必要なすべてのレコードを含む Event_log というメイン テーブルが 1 つあります。この表には、「Grp」と呼んでいる列が 1 つあります。簡単にするために、このグループには A と B の 2 つの値しかないと仮定します。したがって、1 つの列「Grp」と「Actual Date」というもう 1 つの列を持つ 1 つのテーブル Event_log ができました。最後に、このテーブルにフラグ列をもう 1 つ追加します。これは次のように機能します。

まず、以下に示すように、日付の降順ですべてのレコードを並べ替えます。次に、各グループ「A」行に 1 または 0 でフラグを立てたいと考えています。 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

demo を使用した SQL Fiddle

于 2013-02-22T22:33:34.880 に答える