首页 > 解决方案 > 选择 MAX() 或在加入时选择 TOP 1

问题描述

我正在使用以下代码,每个案例只获得一个关联人,使用 MAX Associated Type 获得前 1 个。

关联类型不是 GUID,而是看起来像:

责任方、基层医师等

碰巧责任方是最后一个按字母顺序排列的选项,所以这是一个幸运的解决方法。然而,并非每个案例都有责任方,如果没有责任方,则下一个最高关联人“足够好”并且无论如何都会突出显示为数据错误。

结果显示了每个相关联的人(而不是前 1 个),但将所有这些人都显示为责任方,这是不正确的。我在这里做错了什么?

FROM T_LatestIFSP Ltst

LEFT OUTER JOIN ( 
    SELECT
        Clas.ClientCase_ID,
        MAX(Astp.AssociatedType) AS AssociatedType
    FROM
        T_ClientAssociatedPerson Clas
        Inner Join T_AssociatedType Astp
        ON  Clas.AssociatedType_ID = Astp.AssociatedType_ID
    GROUP BY Clas.ClientCase_ID
) AS Astp ON Ltst.ClientCase_ID = Astp.ClientCase_ID


LEFT OUTER JOIN T_ClientAssociatedPerson Clas
    on Clas.ClientCase_ID = Astp.ClientCase_ID


LEFT OUTER JOIN T_AssociatedPerson Aspr
    ON Aspr.AssociatedPerson_ID = Clas.AssociatedPerson_ID

在此处输入图像描述

标签: sqlsql-servertsqljoin

解决方案


你可以试试这个查询。

rn从你的order条件CASE WHEN

您可以使用Rank窗口函数在子查询中制作排名号,然后获取rnk=1数据行。

;WITH CTE AS (
  SELECT ClientCase_ID,
          AssociatedPerson_ID,
          AssociatedPersonType,
          AssociatedType_ID,
          RANK() OVER(PARTITION BY ClientCase_ID ORDER BY rn desc,AssociatedPerson_ID) rnk
      FROM (
        SELECT t1.ClientCase_ID,
               t1.AssociatedPerson_ID,
               t1.AssociatedPersonType,
               t1.AssociatedType_ID,
                (CASE 
                 WHEN t1.AssociatedPersonType = 'ResPonsible Party'  then 16
                 WHEN t1.AssociatedPersonType = 'Primary Physician'  then 15
                 ELSE 14
                 END) rn
        FROM T t1 
        INNER JOIN T t2 ON t1.ClientCase_ID = t2.AssociatedPerson_ID 
        UNION ALL 
        SELECT t2.AssociatedPerson_ID,
               t1.AssociatedPerson_ID,
               t1.AssociatedPersonType,
               t2.AssociatedType_ID,
                (CASE 
                 WHEN t2.AssociatedPersonType = 'ResPonsible Party'  then 16
                 WHEN t2.AssociatedPersonType = 'Primary Physician'  then 15
                 ELSE 14
                 END) rn
        FROM T t1 
        INNER JOIN T t2 ON t1.ClientCase_ID = t2.AssociatedPerson_ID
    ) t1
)
select DISTINCT ClientCase_ID,AssociatedPerson_ID,AssociatedPersonType,AssociatedType_ID
FROM CTE 
WHERE rnk = 1

sqlfiddle


此外,您可以尝试使用CROSS APPLYwith value 而不是UNION ALL

;with CTE AS (
SELECT v.*, (CASE 
                 WHEN v.AssociatedPersonType = 'ResPonsible Party'  then 16
                 WHEN v.AssociatedPersonType = 'Primary Physician'  then 15
                 ELSE 14
             END) rn
FROM T t1 
INNER JOIN T t2 ON t1.ClientCase_ID = t2.AssociatedPerson_ID
CROSS APPLY (VALUES 
             (t1.ClientCase_ID,t1.AssociatedPerson_ID,t1.AssociatedPersonType,  t1.AssociatedType_ID),
             (t2.AssociatedPerson_ID,t1.AssociatedPerson_ID,t2.AssociatedPersonType, t2.AssociatedType_ID)
             )  v (ClientCase_ID,AssociatedPerson_ID,AssociatedPersonType,AssociatedType_ID)
)
SELECT distinct ClientCase_ID,AssociatedPerson_ID,AssociatedPersonType,AssociatedType_ID
FROM 
(
  SELECT *, 
         RANK() OVER(PARTITION BY ClientCase_ID ORDER BY rn desc,AssociatedPerson_ID) rnk
  FROM CTE
) t1
WHERE rnk = 1

sqlfiddle

笔记

您可以添加您的客户订单号CASE WHEN

[结果]

| ClientCase_ID | AssociatedPerson_ID | AssociatedPersonType | AssociatedType_ID |
|---------------|---------------------|----------------------|-------------------|
|            01 |                  01 |    ResPonsible Party |                16 |
|            02 |                  03 |  Physician Therapist |                24 |

推荐阅读