0

以下のテーブル (TableA と呼びます) を使用して、2 つのデータ セットを選択し、それらを結合する SQL ステートメントを作成する必要があります。最初にStatus = 1、指定した日付よりも DateCreated が大きい (つまり新しい) 行を選択する必要があります。これを StartDate と呼びます。また、DateCreatedが指定された日付よりも大きいすべての行を選択する必要がありますStatus = 0が、結果はDateCreatedで降順にソートされ、これらのレコードの数は2に制限されています.

したがって、テーブル データが次のようになっている場合:

ID   Status        DateCreated
1      1         2013-05-01 14:00
2      1         2013-05-01 15:00
3      1         2013-05-01 16:00
4      0         2013-05-01 17:00
5      0         2013-05-01 18:00
6      0         2013-05-01 19:00
7      0         2013-05-01 20:00

を設定し@startDate to 2013-05-01 14:30、結果セットを次のようにします。

2      1         2013-05-01 15:00
3      1         2013-05-01 16:00
6      0         2013-05-01 19:00
7      0         2013-05-01 20:00

これは、2 つの結果を結合する Union で行うのが最善ですか、それともより効率的な方法がありますか?

4

3 に答える 3

0

必要はありませんUNION-WHERE要件の条項翻訳のみ:

declare @t table (ID int not null,Status int not null,DateCreated datetime not null)
insert into @t(ID,Status,DateCreated) values
(1,1,'2013-05-01T14:00:00'),
(2,1,'2013-05-01T15:00:00'),
(3,1,'2013-05-01T16:00:00'),
(4,0,'2013-05-01T17:00:00'),
(5,0,'2013-05-01T18:00:00'),
(6,0,'2013-05-01T19:00:00'),
(7,0,'2013-05-01T20:00:00')

declare @startDate datetime
set @startDate ='2013-05-01T14:30:00'

;With Numbered as (
    select *,ROW_NUMBER() OVER (PARTITION BY Status ORDER BY DateCreated desc) as rn
    from @t
)
select * from Numbered
where
    DateCreated > @startDate and
    (
        Status = 1 or
        Status = 0 and rn <= 2
    )

確かに、必要なのはStatus0 の行番号だけですが、すべての行で実行しても問題はありません。

于 2013-05-21T08:57:52.887 に答える
0

パフォーマンスの違いについては、実際のデータセットでベンチマークする必要がありますが、代替手段を提供するために、ROW_NUMBER()代わりに使用して書き込むことができます。

SELECT id, status, datecreated FROM (
  SELECT id, status, datecreated,
      ROW_NUMBER() OVER (PARTITION BY status ORDER BY DateCreated DESC) rn
  FROM Table1 WHERE DateCreated > '2013-05-01 14:30'
) a
WHERE status = 1 OR rn < 3
ORDER BY DateCreated;

でテストする SQLfiddle

于 2013-05-21T08:58:29.010 に答える