如何解决模式平均值 - 在 SQL Server 中需要帮助进行计算
我需要通过 clinic
计算模式平均值。测试数据如下:
诊所 | 测试2 |
---|---|
A123 | 2 |
A123 | 3 |
A123 | 4 |
A123 | 3 |
A123 | 3 |
B123 | 2 |
B123 | 2 |
B123 | 2 |
B123 | 2 |
B123 | 2 |
B123 | 4 |
我可以显示所有诊所的模式
SELECT TOP 1 test2,Clinic
FROM [JFF].[dbo].[Test_table]
GROUP BY clinic,test2
ORDER BY COUNT(*) DESC
但是,我想要每个诊所的模式,而不是所有诊所。我真正想要的是展示:
诊所 | 模式 |
---|---|
A123 | 3 |
B123 | 2 |
任何帮助将不胜感激。谢谢。
解决方法
我们可以使用窗口函数或分组来计算 Test2 值的出现次数,然后使用另一个窗口函数(在单独的操作中)按最多到最少对计数进行排序,并仅选择最多的行:
WITH x as (
SELECT clinic,Test2,COUNT(*) as ct FROM [JFF].[dbo].[Test_table] GROUP BY clinic,test2
),y AS (
SELECT x.*,row_number() over(PARTITION BY clinic order by ct desc) rn FROM x
)
SELECT clinic,test2 FROM y WHERE rn = 1
如果您仍然觉得它可读/可理解,您也可以将其折叠一点:
WITH x as (
SELECT clinic,ROW_NUMBER() OVER(PARTITION BY clinic ORDER BY COUNT(*) DESC) as rn
FROM [JFF].[dbo].[Test_table]
GROUP BY clinic,test2
)
SELECT clinic,test2 FROM x WHERE rn = 1
如果您有两个具有相同模式的 Test2:
clinic test2
A123 2
A123 2
A123 5
A123 5
如果您同时想要它们,您可以将 ROW_NUMBER 切换为 DENSE_RANK 以返回它们
,你能不能尝试一下:
WITH CTE(CLINIC,TEST) AS
(
SELECT 'A123',2
UNION ALL
SELECT 'A123',3
UNION ALL
SELECT 'A123',4
UNION ALL
SELECT 'A123',3
UNION ALL
SELECT 'A123',3
UNION ALL
SELECT 'B123',2
UNION ALL
SELECT 'B123',2
UNION ALL
SELECT 'B123',4
)
SELECT SQ.CLINIC,SQ.TEST FROM
(
SELECT X.CLINIC,X.TEST,X.CNTT,ROW_NUMBER()OVER(PARTITION BY X.CLINIC ORDER BY X.CNTT DESC)AS XCOL
FROM
(
SELECT C.CLINIC,C.TEST,COUNT(*)CNTT
FROM CTE AS C
GROUP BY C.CLINIC,C.TEST
)X
)AS SQ WHERE SQ.XCOL=1;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。