sql - 左连接子查询但限制在第一行
问题描述
我正在将指标表加入客户列表。当前,当连接时,连接列会为所有行上的每个客户端填充。
目标是每个客户端分组 (hsp.PROV_ID) 只填充一次指标。- 第二张图片
select hsp.PROV_ID, HSP.id from hsp_client hsp
left join(select vat.ASGN_PROV_ID, sum(vat.ASGN_DFI_CNT) as 'Deficiency Count', sum(vat.DLQ_DFI_CNT) as 'Delinquent Count' from V_DT_PROV_ASGN_METRICS vat
where VAT.PAT_CLASS_C IN ('101', '102','104')
and VAT.METRIC_DATE = Convert(DATE, GetDate())
--and DEF_ID IS NULL
and vat.DEF_TYPE_C not in ('9')
group by vat.ASGN_PROV_ID,vat.ASGN_DFI_CNT,vat.DLQ_DFI_CNT
) vtt on vtt.ASGN_PROV_ID =hsp.PROV_ID
group by hsp.PROV_ID, hsp.id
解决方案
如果我理解您的问题,您只需要每个 的“第一”行上的指标prov_id
,其中“第一”行由 定义hsp.id
。
您不需要在外部查询中进行聚合,只需一些关于窗口函数的逻辑:
select hsp.PROV_ID, HSP.id,
(case when hsp.id = min(hsp.id) over (partition by hsp.prov_id)
then vtt.DeficiencyCount
end) as DeficiencyCount,
(case when hsp.id = min(hsp.id) over (partition by hsp.prov_id)
then vtt.DelinquentCount
end),
from hsp_client hsp left join
(select vat.ASGN_PROV_ID, sum(vat.ASGN_DFI_CNT) as DeficiencyCount,
sum(vat.DLQ_DFI_CNT) as DelinquentCount
from V_DT_PROV_ASGN_METRICS vat
where VAT.PAT_CLASS_C IN ('101', '102','104') and
VAT.METRIC_DATE = Convert(DATE, GetDate()) and
--and DEF_ID IS NULL
vat.DEF_TYPE_C not in ('9')
group by vat.ASGN_PROV_ID
) vtt
on vtt.ASGN_PROV_ID = hsp.PROV_ID
order by hsp.PROV_ID, hsp.id;
这种逻辑通常在应用层完成,但您可以在 SQL 中完成。
我什至不确定子查询中是否需要聚合。但 。. . 它应该只在“provid id”级别。
推荐阅读
- javascript - Favicon 未在 IE11 中为 Angular 7 应用程序呈现
- java - 使用迭代器从 ArrayList 中删除元素
- android - Volley StringRequest 发送参数 POST 方法
- react-native-ios - 在 react-native 应用程序的 ios 上未显示 reCAPTCHA 图标
- php - 当我们在 razorpay 中使用测试模式时,实际支付转账是否在 php 中?
- sql - 获取 mariaDB/SQL 记录数的最有效方法
- java - (Java)在return方法中学习try catch
- templates - 通过枚举值为静态多态选择模板特化
- asp.net-web-api - 有没有办法用 Microsoft.AspNet.WebApi.HelpPage 生成静态 html 页面?
- android - 无法使用库项目构建 android 项目:清单合并失败并出现多个错误