首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >除了两个CTE之外,这个查询还能解决吗?

除了两个CTE之外,这个查询还能解决吗?
EN

Stack Overflow用户
提问于 2018-10-16 15:03:37
回答 1查看 66关注 0票数 0

我正在使用随机生成的虚构名称和数据,针对一个名为理赔的虚构保险蛤表编写一个查询。

在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中完成,或者使用某种形式的交叉应用?

我包括我的代码和下面的输出。

代码语言:javascript
运行
复制
;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博诺·埃杰斯坦

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-17 21:53:18

您应该只需要一个子查询或CTE,因为您可以在ROW_NUMBER()中使用聚合。

下面是一种使用子查询的方法:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
;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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52838534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档