【问题标题】:Mode average - need help for calculation in SQL Server模式平均 - 需要帮助在 SQL Server 中进行计算
【发布时间】:2021-01-02 10:17:59
【问题描述】:

我需要通过clinic 计算模式平均值。测试数据如下:

Clinic Test2
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

但是,我想要每个诊所的模式,而不是所有诊所。我真正想要的是展示:

Clinic Mode
A123 3
B123 2

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: sql sql-server average


    【解决方案1】:

    我们可以使用窗口函数或分组来计算 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, Test2, 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 来返回它们

    【讨论】:

      【解决方案2】:

      你能不能尝试一下:

      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' ,    2
         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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-28
        • 1970-01-01
        • 2012-03-05
        • 2011-07-10
        • 2015-08-01
        • 2016-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多