如何通过在另一个字段中选择较小的值来选择两个记录中的一个

时间:2016-09-15 19:30:05

标签: sql-server tsql

附件是我的数据样本。在我的数据中,我有两个客户端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

2 个答案:

答案 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