2

すべての行が配信するメールである SQL Server のテーブルがあります。すべての電子メールはドメインに属しています。

日付列に基づいて送信する最初の電子メールを選択する必要がありますが、ラウンドロビン方式で使用された最後のドメインから開始して、ドメインごとに交互に送信したいと考えています

テーブル:

CREATE TABLE Delivery (Date datetime, Domain int);

INSERT INTO Delivery (Date, Domain)
VALUES
    ('2014-01-07 11:24:31', 1),
    ('2014-04-07 13:21:42', 2),
    ('2014-02-07 14:48:58', 3),
    ('2014-03-07 15:58:01', 1),
    ('2014-06-07 15:58:01', 2),
    ('2014-01-07 12:58:01', 3),
    ('2014-01-07 19:58:01', 1) ;

このクエリを使用すると、必要に応じて並べ替えることができますが、開始値で並べ替える方法が見つかりません。

SELECT [Date],[Domain]
FROM (
  SELECT    [Date] ,[Domain],
  ROW_NUMBER() OVER (PARTITION BY [Domain] ORDER BY [Date]) AS recID
  FROM  Delivery ) AS r
ORDER BY    recID, [domain] 

SqlFiddle

私は次のようなことを言う必要があります:

ORDER BY [domain] > @lastuseddomain

mysql FIELD() 関数に似たもの

一定の間隔でこのクエリを実行する必要がありますTOP 1 。期待される結果は、存在する場合は前の行のドメイン > ドメインで最も古い行を取得するか、ドメイン = 1 で再起動することです。

ドメイン上の循環ソートのように

4

3 に答える 3

1

あなたの努力に感謝しますが、私は解決策を見つけると思います:

SELECT TOP 1 [Date],[Domain]
FROM (
  SELECT [Date] ,[Domain], 
         ROW_NUMBER() OVER (PARTITION BY [Domain] ORDER BY [Date]) AS recID
  FROM  Delivery ) AS r
ORDER BY recID, 
   (CASE WHEN domain >@LASTUSEDDOMAIN THEN domain
         ELSE domain + (select top 1 domain from delivery order by domain desc) 
    END)
于 2014-06-06T16:44:01.863 に答える
0

編集 -

私は完全に間違っていました。以下のブラムは、実際に答えのように見えるものをあなたに与えました. 申し訳ありません!

元の投稿:

任意の数のドメイン (および時間) が与えられた場合、SQL でこれを行う方法がわかりません。行N + 1を選択するための条件を設定するには、結果セットに行Nが必要ですが、これは実行できません。ドメイン/時間の数が限られている場合は、UNPIVOTクエリで何かを実行できるかもしれませんが、動的SQLを使用する必要があると思います-SQLは、処理するデータが何であるかを知っているプログラムによって生成されます。

それが正しければ、おそらくデータを取得した後、クエリを生成して実行するのに時間を無駄にしていることになります (それがどのように効率的なクエリになるかわかりません)。代わりに、コードで検索可能なリストにデータを取得し、コードで最初のものを取得してから、最初のものを知ってから2番目のものを取得するなど.

ちょっと厄介なコードのように聞こえますが、適切な検索可能な構造を見つけるのは楽しいかもしれません。

申し訳ありませんが、これ以上役に立ちませんが、どうすればよいかわかりません。

于 2014-06-06T16:36:02.377 に答える