2016-09-15 157 views
1

附加是我的數據樣本。在我的數據中,我有兩個客戶端ID。這意味着他們有一個主要和次要支付來源ID(保險)。主要保險由較低的優先數量決定。我想要做的是僅選擇不同的客戶端ID記錄,並且只選擇出現兩次的主要付費源ID(並非全部都是)。下面是我試過的查詢,但它沒有奏效。如何通過在另一個字段中選擇較小的值來選擇兩條記錄中的一條

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。

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 

第三種辦法是生成一組數據,僅由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 
相關問題