首页 > 解决方案 > 左连接子查询但限制在第一行

问题描述

我正在将指标表加入客户列表。当前,当连接时,连接列会为所有行上的每个客户端填充。

目标是每个客户端分组 (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

目前的输出 期望的输出

标签: sqlsql-server

解决方案


如果我理解您的问题,您只需要每个 的“第一”行上的指标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”级别。


推荐阅读