2016-09-15 3 views
1

データのサンプルが添付されています。私のデータには2つのクライアントIDがあります。これは、彼らにプライマリとセカンダリの支払い元ID(保険)があることを意味します。プライマリ保険は優先順位の低い番号によって決まります。私がしたいのは、別個のクライアントIDレコードだけを選択し、2回出現する(すべてではない)プライマリペイソースIDのみを選択することです。以下は私が試したクエリですが、うまくいきませんでした。別のフィールドで小さい方の値を選択して2つのレコードのいずれかを選択する方法

SELECT 
    CLIENT_ID, PAYSRC_ID, 
    MIN([PRIORITY]) AS PRI, 
    EFFECTIVE_DATE, EXPIRES_DATE 
FROM 
    CDCLINS 
WHERE 
    EXPIRES_DATE IS NULL 
GROUP BY 
    CLIENT_ID, PAYSRC_ID, EFFECTIVE_DATE, EXPIRES_DATE 
ORDER BY 
    CLIENT_ID 

Data_example

+1

"...しかし、それは働いていません。"問題のトラブルシューティングを手伝っている人には役に立ちません。 – dfundako

答えて

3

我々は、優先順位によって順序付けられた行番号を設定し、各CLIENT_ID(パーティション)の最初の行に制限するために分析を使用することができ

WITH CTE AS (
SELECT 
    CLIENT_ID 
    , PAYSRC_ID 
    , PRIORITY 
    , EFFECTIVE_DATE 
    , EXPIRES_DATE 
    , row_number() over (partition by client_ID order by priority asc) rn 
FROM CDCLINS 
WHERE EXPIRES_DATE IS NULL 
) 
SELECT * 
FROM cte 
WHERE rn = 1 
ORDER BY CLIENT_ID 

また、これを行うことができサブクエリでも同様に使用され、CTEは回避されます。第三のアプローチのみCLIENT_IDから成るデータの組と最も低い優先度を生成し、インナーだけにデータを制限するために参加できるようにバック基本セットに設定されたこのデータを結合することであろう

SELECT * 
FROM (
    SELECT 
     CLIENT_ID 
    , PAYSRC_ID 
    , PRIORITY 
    , EFFECTIVE_DATE 
    , EXPIRES_DATE 
    , row_number() over (partition by client_ID order by priority asc) rn 
    FROM CDCLINS 
    WHERE EXPIRES_DATE IS NULL) CTE 
WHERE rn = 1 
ORDER BY CLIENT_ID 

各クライアントの最小優先度。このアプローチは、データベースが分析関数をサポートしていない場合に最も一般的です。

SELECT 
    A.CLIENT_ID 
    , PAYSRC_ID 
    , PRIORITY 
    , EFFECTIVE_DATE 
    , EXPIRES_DATE 
FROM CDCLINS A 
INNER JOIN (SELECT CLIENT_ID, MIN(Priority) mPri 
      FROM CDCLINS 
      GROUP BY Client_ID) B 
    on A.CLIENT_ID = B.Client_ID 
and A.Priority = B.mPri 
WHERE EXPIRES_DATE IS NULL 
0

正規クエリ:

DECLARE @T TABLE 
(
    CLIENT_ID INT, 
    PAYSRC_ID INT, 
    PRIORITY INT 
) 
INSERT @T SELECT 3156,3200,1 
INSERT @T SELECT 3156,9000,8 
INSERT @T SELECT 3157,9000,8 
INSERT [email protected] SELECT 3157,300,1 
INSERT @T SELECT 3159,3200,1 
INSERT @T SELECT 3154,9000,8 


SELECT 
    CLIENT_ID, 
    PAYSRC_ID 
FROM 
(
    SELECT 
     CLIENT_ID, 
     PAYSRC_ID, 
     ReverseRowNumber=ROW_NUMBER() OVER(PARTITION BY CLIENT_ID ORDER BY PRIORITY ASC) 
    FROM 
     @T 
) AS X 
WHERE 
    ReverseRowNumber=1 
関連する問題