2009-08-28 12 views
0

でテーブル変数から、最高得点の結果を選ぶ:は、私はSQL Server 2005で次の表の変数を持つSQL

DECLARE @results TABLE (id int IDENTITY(1,1), 
         customerId int, 
         salesId int, 
         score int, 
         lastServiceDate datetime, 
         PRIMARY KEY(id)); 

それはように私は、テーブルを掃除またはテーブルの結果にアクセスするための効率的な方法を必要としますsalesIdごとに1つの結果しか返しません。 salesIdごとに1つ以上の結果がある場合は、得点が最も高い行を表示するか、または同値の場合はCustomerテーブルの最新のlastServiceDateを表示する必要があります。

今、私のテストデータは次のようになります。

id customerId salesId score lastServiceDate 
1 950   418  3  2009-08-09 00:00:00.000 
2 951   418  3  2009-08-19 00:00:00.000 
3 952   418  1  2009-08-22 00:00:00.000 
4 953   419  2  2009-08-15 00:00:00.000 

私はこの例では、戻ってくる何か、わずか2行たい - ID 2(salesId 418のトップスコア/ lastServiceDate)とidを4(salesId 419の結果のみ)。最後に、このテーブルのデータを取り込み、JobResultテーブルに挿入して、customerIdと@resultsからsalesIdを選択する必要があります。これらの制限があります。

(これはhttps://stackoverflow.com/questions/1343647に尋ねた質問を終了します。)

+1

これは、@記号で識別される「テーブル変数」ですが、#resultsは一時表です。 @はメモリにあり、#はディスク上にあります。 –

+0

したがって、顧客に関係なくsalesIdごとに1行が必要ですか? salesId 3が同じ日に2人の顧客にサービスを提供し、それぞれが全く同じスコアを受け取ったらどうなるでしょうか? JobResultテーブルに何を挿入する必要がありますか? –

答えて

1

を:

SELECT id, salesId, score, lastServiceDate 
from (select id, salesId, score, lastServiceDate 
     ,row_number() over(partition by SalesId order by score desc, lastServiceDate desc) ranking 
     from @results) xx 
where xx.ranking = 1 

を、これから望ましくない行を削除しますテーブルはあなたが望むものだけを残す:

DELETE @results 
where id in (select id 
       from (select id, salesId, score, lastServiceDate 
         ,row_number() over(partition by SalesId order by score desc, lastServiceDate desc) ranking 
         from @results) xx 
       where xx.ranking <> 1) 

select * from @results 

あなたが投稿したデータでこれをテストしましたが、より大きい/より複雑なデータセットで試してみてください。

0

この試してみてください。これは必要なデータが返されます

WITH highscore AS (
     SELECT r.salesid, 
       MAX(r.score) 'maxscore', 
       MAX(t.lastservicedate) 'maxservicedate' 
     FROM @results r 
    GROUP BY r.salesid) 
    SELECT t.customerid, 
     t.salesid, 
     t.lastservicedate 
    FROM @results t 
    JOIN highscore hs ON hs.salesid = t.salesid 
        AND hs.maxscore = t.score 
        AND hs.maxservicedate = t.lastservice 
GROUP BY t.customerid, 
     t.salesid 
+0

これは確かに最大得点結果を解析するのに正しいと思われますが、lastservicedateでは機能しないようです。この方法でグループを切り離すわけではありません。 – Brisbe42

+0

@Brisbe:グループからlastservicedateを削除してください。 –

+0

更新:CTEおよびそれ以降の結合句を修正しました。 –