2016-04-29 6 views
0

私はクライアントとその保険プロバイダとのテーブルを持っています。優先度は1〜8の列があります。私は私の 'マスターテーブル'に最低優先保険を選択できるようにしたいと思います。料金、日付、医師などを提供するクエリがあり、Client_IDのメインクエリに参加できるサブクエリが必要です。いつも私は、私はあなたがかなり簡単にするために求めている考える結果を達成することができた保険表は、関係の多くの側面である最低優先度に応じてサブクエリから特定の行を選択する

 
Row#  Client_id Insurance_id Priority active? 
1   333   A   1  Y 
2   333   B   2  Y 
3   333   C   1  N 
4   222   D   6  Y 
5   222   A   8  Y 
6   444   C   4  Y 
7   444   A   5  Y 
8   444   B   6  Y 

回答が

 
     Client_id Insurance_id Priority 
     333   A   1 
     222   D   6 
     444   C   4 

答えて

0

する必要があります。1.で始まりますSQLのROW_NUMBER()機能を利用して:

declare @tbl table 
(
    Id int identity, 
    ClientId int, 
    InsuranceId char(1), 
    [Priority] int, 
    Active bit 
) 

insert into @tbl (ClientId, InsuranceId, [Priority], Active) 
values (1, 'A', 1, 1), 
    (1, 'A', 2, 1), 
    (1, 'B', 3, 1), 
    (1, 'B', 4, 1), 
    (1, 'C', 1, 1), 
    (1, 'C', 2, 0), 
    (2, 'C', 1, 1), 
    (2, 'C', 2, 1) 

select Id, ClientId, InsuranceId, [Priority] 
from 
(
    select Id, 
     ClientId, 
     InsuranceId, 
     [Priority], 
     ROW_NUMBER() OVER (PARTITION BY ClientId, InsuranceId ORDER BY [Priority] desc) as RowNum 
    from @tbl 
    where Active = 1 
) x 
where x.RowNum = 1 

結果:

(8 row(s) affected) 
Id   ClientId InsuranceId Priority 
----------- ----------- ----------- ----------- 
2   1   A   2 
4   1   B   4 
5   1   C   1 
8   2   C   2 

(4 row(s) affected) 
+0

私はPARTITIONとROW NUMBERを検討する必要があるが、私は、この例では私の質問に答えるとは思いません。ポリシーが有効な場合は最低の優先順位が必要です。あなたの例では2つのクライアントしか持っていないので、結果として行1と7が必要になります。クライアントごとに1つの優先順位。ありがとう、私はあなたの答えをもう一度見直します。 – bob

+0

ROW_NUMBER()についていくつかの調査を行った後、PARTITIONと組み合わされたときに何が起こっているのかが分かりました。これは実際に私の問題を解決します。あなたのRESULTSテーブルで混乱していたのは、複数のCLIENTID行でした。最低の優先度を持つクライアントごとに1つの行しか必要としませんでした。とにかく、これは私の実際のデータに適用すると、これは完璧に働いてくれてありがとう。 – bob

+0

さて、あなたの問題の答えとしてこれをマークできますか? ;) –

関連する問題