2

私の会社には、プログラム、スタッフ、クライアント、およびイベントがあります。各プログラムの各スタッフに対して 2 つのランダムなクライアント イベントを監査します。

プログラムで過去 6 か月間にクライアント イベントが発生したすべてのスタッフを選択するクエリを作成しました。

SELECT TOP(2) 
    program_id, staff_id, client_id, event_date
FROM 
    events 
INNER JOIN 
    client ON events.client_id = client.client_id
WHERE 
    <blah, blah> --by date range, program, client showed up at event ...
ORDER BY 
    NEWID() --randomizes the top 2 picked from this set

ここで、各プログラムの各スタッフ メンバーに対してそれを繰り返す必要があります。スタッフは複数のプログラムに参加できます。その場合、スタッフとプログラムの組み合わせごとに 2 つのクライアント イベントを監査します。

結果は次のようになります。

program_id  staff_id    client_id   event_date

p1  12345   abc123  8/26/2013
            xyz123  5/16/2013
p1  23456   bcd123  7/26/2013
            wxy123  4/16/2013
p2  12345   cde123  9/26/2013
            xyz123  3/16/2013
p3  34567   efg123  7/26/2013
            uvw123  5/16/2013

(これを xls に吐き出して、プログラムごとに個別のタブを作成するとよいでしょう。)

他の人も同様の質問を投稿しています。これは、セットで考える方法の純粋な例であるため、投稿しています。そのセットを繰り返すのを手伝ってください。ありがとうございました。

4

2 に答える 2

0

要件を 100% 理解しているとは言えませんが、ニーズに合わせてこれを適応させることはできます。「譜面と番組の組み合わせごとに、ランダムに2つのイベントを引く」と理解しました。

最初に可能なスタッフ/プログラムの組み合わせを計算します。次に、組み合わせごとに 2 つのランダムなイベントを描画します。

WITH combinations AS (
 SELECT DISTINCT program_id, staff_id
 FROM events
)
SELECT e.*
FROM combinations c
CROSS APPLY (
 SELECT TOP 2 *
 FROM events e
 WHERE e.program_id = c.program_id AND e.staff_id = c.staff_id
 ORDER BY NEWID()
) e

CROSS APPLY「各外側の行(この場合はそこから引き出されるc)に対して、次の行をそれに結合する」ことを意味します。

別のバージョンは次のとおりです。

SELECT *
FROM (
 SELECT *, ROW_NUMBER() OVER (PARTITION BY program_id, staff_id ORDER BY NEWID()) r
 FROM events e
) e
WHERE e.r <= 2

はるかにエレガント。

于 2013-10-04T15:56:18.150 に答える