选择MAX()或在联接上选择TOP 1

时间:2018-08-01 21:38:47

标签: sql sql-server tsql join

我正在使用以下代码,使每个案例仅获得一个相关人员,并使用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

enter image description here

3 个答案:

答案 0 :(得分:1)

您可以尝试此查询。

根据您在rn的{​​{1}}条件中获得order

您可以将CASE WHEN window函数一起使用,以在子查询中确定排名,然后获取Rank数据行。

rnk=1

sqlfiddle


此外,您可以尝试将;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 与值一起使用,而不是CROSS APPLY

UNION ALL

sqlfiddle

注意

您可以在;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

中添加客户订单号

[结果]

CASE WHEN

答案 1 :(得分:1)

要在选择中获得AssocId,您必须进行自我连接。

左外连接 (您的子选择中包含max(AssociatedType))AS Astp

INNER JOIN T_AssociatedType AS Astp2 开启(无论该表上的主键是什么)

然后,您可以将astp2.AssociationTypeId添加到原始SELECT中。

答案 2 :(得分:0)

我用以下代码解决了这个问题:

 LEFT OUTER JOIN T_ClientAssociatedPerson Clas
    on Clas.ClientCase_ID = Ltst.ClientCase_ID
    and
        CASE
        WHEN Clas.AssociatedType_ID = 16 AND Clas.ClientCase_ID = Ltst.ClientCase_ID THEN 1
        WHEN Clas.AssociatedType_ID <> 16 AND Clas.AssociatedType_ID = (
            SELECT TOP 1 Clas.AssociatedType_ID
            FROM T_ClientAssociatedPerson Clas
            WHERE Clas.ClientCase_ID  = Ltst.ClientCase_ID
            ORDER BY AssociatedType_ID DESC
        ) THEN 1
        ELSE 0
        END = 1