sql - 选择 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
解决方案
你可以试试这个查询。
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
此外,您可以尝试使用CROSS APPLY
with 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
笔记
您可以添加您的客户订单号CASE WHEN
[结果]:
| ClientCase_ID | AssociatedPerson_ID | AssociatedPersonType | AssociatedType_ID |
|---------------|---------------------|----------------------|-------------------|
| 01 | 01 | ResPonsible Party | 16 |
| 02 | 03 | Physician Therapist | 24 |
推荐阅读
- django - Django 过滤器 - 条件查询
- regex - Flutter/Dart:正则表达式替换为 2 美元?
- php - 当我的桌子填满时,DOMPDF 整个桌子被打破到一个新的页面
- swift - 在 ZStack 中分组时,SwifUI 导航标题损坏
- node.js - 如何用 Jest 模拟 s3.upload() - node.js
- visual-studio-code - 自定义 VSCode 扩展:在 webview 中嵌入原生编辑器
- python - 日期时间列在 python 中为 Postgres 表提供了意外的格式
- c++ - 错误代码预期 a')' 发生在逻辑运算符上
- python - 在matplotlib中控制散点图y轴顺序
- reactjs - 输入字段应占据提供的所有空间