附件是我的数据样本。在我的数据中,我有两个客户端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
答案 0 :(得分: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
答案 1 :(得分: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 a@T 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