我想为每个人保留一个唯一的CLIENT_ID记录,但为每个CLIENT_ID拉入第一行(仅一行)数据。对于大多数 CLIENT_ID,大约有 20 行数据,但我想要提取的大多数变量将始终匹配。例如,对于 CLIENT_ID 555,有 20 行数据,但 CLIENT_ID 555 的 20 行中的每一行的 STATE_CODE 都是相同的。(我读过有关 LEFT JOIN 的其他文章,以及为什么很难仅拉入一个数据)记录,但作为一个 SQL 新手,我不知道如何避免这个?)
但是,在某些行中,20 行中每一行的变量都不同。对于这些变量,我只想获得总数。例如,对于 VACCINE_TYPE,我想计算该 CLIENT_ID 的 20 行中有多少行是 VACCINE_TYPE = COVID-19(即,如果 CLIENT_ID 555 的变量名称 VACCINE_TYPE 下的 20 行中有 2 行 = COVID-19,那么我想要标有“新冠肺炎”的栏目写着“2”。
我还需要从“地址”表中提取 STATE_CODE。
选择 cl.CLIENT_ID, cl.FN, cl.FN, cl.BD, cl.BCN, 地址.STATE_CODE,
(从免疫 IM 中选择 COUNT (im.VACCINE_TYPE),其中 im.VACCINE_TYPE = 'COVID-19')作为 COVID 来自客户 cl 左连接 IMMUNE im ON im.CLIENT_ID = cl.CLIENT_ID 左连接 ADDRESS addr ON addr.ADDRESS_ID = cl.ADDRESS_ID WHERE addr.STATE_CODE='05' AND cl.BD 之间 to_date('01/01/2022','MM/DD/YYYY' AND to_date('12/31/2022','MM/DD/YYYY') AND ((cl.FN <> 'BBY' AND cl.FN 不喜欢 '%NB%' AND cl.FN 不喜欢 '%BB %' AND cl.FN 不喜欢 '%BOY%' AND cl.FN 不喜欢“%GIRL%”和 cl.FN 不喜欢“%BABY%”和 cl.FN 不喜欢“%UNKNOWN%”和 cl.FN 不喜欢“%BBA %” 并且 cl.FN 不喜欢“%BG %”并且 cl.FN 不喜欢“%BGA %”并且 cl.FN 不喜欢“%PENDING%”) 并且 cl.BCN 为空) OR (cl.BCN <> '空' AND (cl.FN <> 'BBY' AND cl.FN 不喜欢 '%NB%' AND cl.FN 不喜欢 '%BB %' AND cl.FIRST_NAME 不喜欢 '%BOY%' AND cl.FN 不喜欢“%GIRL%” AND cl.FN 不喜欢“%BABY%” AND cl.FN 不喜欢“%UNKNOWN%” AND cl.FIRST_NAME 不喜欢“%BBA %” AND cl.FN 不喜欢'%BG %' 和 cl.FN 不喜欢 '%BGA %' 和 cl.FNE 不喜欢 '%PENDING%')) 按 cl.FN 订购
您可以使用
ROW_NUMBER()
等窗口函数为每个CLIENT_ID
选择不同的记录,确保每个客户端仅获得一行数据。要对 VACCINE_TYPE = 'COVID-19'
等特定条件进行计数,请使用条件聚合(SUM 中的 CASE)与 PARTITION BY
结合来获取每个 CLIENT_ID
的计数:
SELECT cl.CLIENT_ID,
cl.FN,
cl.BD,
cl.BCN,
addr.STATE_CODE,
SUM(CASE WHEN im.VACCINE_TYPE = 'COVID-19' THEN 1 ELSE 0 END) OVER (PARTITION BY cl.CLIENT_ID) AS COVID_COUNT
FROM (
SELECT CLIENT_ID, FN, BD, BCN, ADDRESS_ID,
ROW_NUMBER() OVER (PARTITION BY CLIENT_ID ORDER BY your_ordering_column) AS rn
FROM CLIENT
WHERE BD BETWEEN TO_DATE('01/01/2022', 'MM/DD/YYYY') AND TO_DATE('12/31/2022', 'MM/DD/YYYY')
AND ((FN <> 'BBY' AND FN NOT LIKE '%NB%' AND FN NOT LIKE '%BB %' AND FN NOT LIKE '%BOY%'
AND FN NOT LIKE '%GIRL%' AND FN NOT LIKE '%BABY%' AND FN NOT LIKE '%UNKNOWN%'
AND FN NOT LIKE '%BBA %' AND FN NOT LIKE '%BG %' AND FN NOT LIKE '%BGA %'
AND FN NOT LIKE '%PENDING%')
AND (BCN IS NULL OR BCN <> 'Null'))
) cl
LEFT JOIN IMMUNE im ON im.CLIENT_ID = cl.CLIENT_ID
LEFT JOIN ADDRESS addr ON addr.ADDRESS_ID = cl.ADDRESS_ID
WHERE addr.STATE_CODE = '05'
AND cl.rn = 1
GROUP BY cl.CLIENT_ID, cl.FN, cl.BD, cl.BCN, addr.STATE_CODE
ORDER BY cl.FN;