我正在使用随机生成的虚构名称和数据,针对一个名为理赔的虚构保险蛤表编写一个查询。
在PRIMARY_DX专栏中有5种不同的分类:酗酒,焦虑症,抑郁,精神病,物质使用障碍
其他主要列是PATIENT_ID和CLAIM_PAID_AMT。
我想对每名病人的CLAIM_PAID_AMT进行汇总,并列出每PRIMARY_DX金额最高的前5名患者。
我认为唯一能做到这一点的方法是使用两个公共表表达式,在CTE1中,我通过PRIMARY_DX和PATIENT_ID进行分区,并对每个患者的CLAIM_PAID_AMT进行求和。
然后,在CTE2中,我在CTE1上使用一个ROW_NUMBER函数,根据PRIMARY_DX进行分区,并按照TotalClaims DESC进行排序,并从每个PRIMARY_DX中选择前5位。
我已经写了不到2年的SQL了,我想知道这是否可以在一个CTE中完成,或者使用某种形式的交叉应用?
我包括我的代码和下面的输出。
;WITH CTE1 AS
(
select PRIMARY_DX, PATIENT_ID, TotalClaims = SUM(CLAIM_PAID_AMT)
OVER (PARTITION BY PRIMARY_DX, PATIENT_ID ORDER BY PATIENT_ID, CLAIM_PAID_AMT DESC)
from claims
)
,
CTE2 AS
(SELECT *, RowCounter = ROW_NUMBER() OVER (PARTITION BY PRIMARY_DX ORDER BY TotalClaims DESC) FROM CTE1)
select CTE2.PRIMARY_DX, CTE2.TotalClaims from CTE2
where RowCounter <= 5
order by CTE2.PRIMARY_DX, CTE2.TotalClaims DESC
酗酒3737.51乔·史密斯
酗酒3282.07苏西家庭主妇
酗酒3207.72乔伊·斯特鲁默
酒精中毒3040.52锈菌甲
酗酒2997.02大本钟
焦虑障碍3291.14诺曼猪圈
焦虑症3113.05比利·鲍勃
焦虑障碍3101.13南极洲瑞秋
焦虑障碍3058.52约翰
焦虑障碍3021.98凯西·欧罗巴
抑郁3466.14 --弗雷达
抑郁3279.25罗恩·杰拉米泽
抑郁3140.43莎伦沙罗纳兹
抑郁3119.26艾莉·凯特
抑郁3118.54比夫比夫费森
精神病3098.13詹姆斯垄断
精神病2991.23利昂错误地
精神病2857.69露西拉特奇-麦克墨菲
精神病2678.88比利比比茨
精神病2602.24山姆·兹帕茨基
药物使用障碍3435.27唐纳德·杜卡洛纳维茨
物质使用障碍3300.33米奇老鼠夹
药物使用障碍3285.41赫克特赫瑟科茨
药物使用障碍3179 Erin GoBragh
物质使用障碍3147.09博诺·埃杰斯坦
发布于 2018-10-17 21:53:18
您应该只需要一个子查询或CTE,因为您可以在ROW_NUMBER()
中使用聚合。
下面是一种使用子查询的方法:
SELECT *
FROM (
SELECT PRIMARY_DX, PATIENT, SUM(CLAIM_PAID_AMT) AS CLAIM_PAID_AMT,
ROW_NUMBER() OVER (PARTITION BY PRIMARY_DX ORDER BY SUM(CLAIM_PAID_AMT) DESC) AS RowId
FROM Claims GROUP BY PRIMARY_DX, PATIENT
) T
WHERE RowId <= 5
如果你更喜欢CTE:
;WITH CTE AS (
SELECT PRIMARY_DX, PATIENT, SUM(CLAIM_PAID_AMT) AS CLAIM_PAID_AMT,
ROW_NUMBER() OVER (PARTITION BY PRIMARY_DX ORDER BY SUM(CLAIM_PAID_AMT) DESC) AS RowId
FROM Claims GROUP BY PRIMARY_DX, PATIENT
) SELECT * FROM CTE WHERE RowId <= 5
https://stackoverflow.com/questions/52838534
复制相似问题