【问题标题】:Adding Mode to this SQL向此 SQL 添加模式
【发布时间】:2010-01-13 00:08:33
【问题描述】:

我有这个用于 MS SQL Server 2008 的 SQL:

WITH CTE AS (
SELECT e_id, 
   scale, 
   ROW_NUMBER() OVER(PARTITION BY e_id ORDER BY scale ASC) AS rn,   
   COUNT(scale) OVER(PARTITION BY e_id) AS cn
FROM waypoint.dbo.ScoreMaster
WHERE scale IS NOT NULL
)
SELECT e_id,

cast(AVG (cast(scale as decimal(5,2))) as decimal(5,3)) as [AVG],

cast (STDEV(cast(scale as decimal(5,1))) as decimal(5,3)) as [STDDEV],   
AVG(CASE WHEN 2 * rn - cn BETWEEN 0 AND 2 THEN 
    scale END) AS FinancialMedian,

MAX(CASE WHEN 2 * rn - cn BETWEEN 0 AND 2 THEN 
    scale END) AS StatisticalMedian
from CTE
GROUP BY e_id

我想添加模式。 我一直在尝试不同的想法,但还没有任何效果...

【问题讨论】:

  • 当碰巧存在双峰样本(有两种模式)时,您希望您的 sql 表现如何?当有两种以上的模式时?

标签: sql-server


【解决方案1】:
WITH    s (e_id, scale) AS
        (
        SELECT  1, 0.0
        UNION ALL
        SELECT  1, 0.1
        UNION ALL
        SELECT  1, 0.1
        UNION ALL
        SELECT  1, 0.2
        UNION ALL
        SELECT  1, 0.2
        UNION ALL
        SELECT  1, 0.3
        ),
        cte AS
        (
        SELECT  e_id, 
                scale, 
                ROW_NUMBER() OVER (PARTITION BY e_id ORDER BY scale ASC) AS rn,
                COUNT(scale) OVER (PARTITION BY e_id) AS cn,
                COUNT(*) OVER (PARTITION BY e_id, scale) AS sn
        FROM    s
        WHERE   scale IS NOT NULL
        )
SELECT  e_id,
        AVG(scale),
        (
        SELECT  AVG(scale)
        FROM    cte ci
        WHERE   ci.e_id = co.e_id
                AND ci.sn = MAX(co.sn)
        ) AS mode
FROM    cte co
GROUP BY
        e_id

这将选择所有模态比例的平均值。将 AVG 替换为 TOP 1 ... ORDER BY 以获得单个刻度。

注意我们如何在WHERE 子句中使用MAX(co.sn) :)

【讨论】:

    【解决方案2】:

    【讨论】:

    • 我找到了那个来源,但我不知道如何将模式 SQL 合并到我列出的 SQL 中,这样我只能得到一个结果集
    • 这可能很棘手,因为 Mode 可能返回多个值...
    【解决方案3】:

    试试这个:

    ; WITH Mean AS (
    SELECT AVG(scale)/1.0 AS MeanVal
      FROM waypoint.dbo.ScoreMaster
     WHERE scale IS NOT NULL
    ), Median AS (
    SELECT ( ( SELECT TOP 1 scale
                 FROM ( SELECT TOP 50 PERCENT scale FROM waypoint.dbo.ScoreMaster WHERE scale IS NOT NULL ORDER BY scale ) AS A
                ORDER BY scale DESC )
           + ( SELECT TOP 1 scale
                 FROM ( SELECT TOP 50 PERCENT scale FROM waypoint.dbo.ScoreMaster WHERE scale IS NOT NULL ORDER BY scale DESC ) AS A
                ORDER BY scale ASC ) ) / 2.0 AS MedianVal
    ), Mode AS (
    SELECT scale AS ModeVal
      FROM waypoint.dbo.ScoreMaster
     WHERE scale IS NOT NULL
     GROUP BY scale
    HAVING COUNT(scale) = ( SELECT TOP 1 COUNT(scale)
                              FROM waypoint.dbo.ScoreMaster
                             WHERE scale IS NOT NULL
                             GROUP BY scale
                             ORDER BY COUNT(scale) DESC )
    ) 
    SELECT MeanVal
         , MedianVal
         , ModeVal
      FROM Mean
         , Median
         , Mode
    

    我知道这很丑,但诀窍是交叉加入 Mode 给出的所有可能值与 的值均值中值

    【讨论】:

      【解决方案4】:

      或者这个:

      ; WITH Mean AS (
      SELECT AVG(scale)/1.0 AS MeanVal
        FROM waypoint.dbo.ScoreMaster
       WHERE scale IS NOT NULL
      ), Median AS (
      SELECT ( ( SELECT TOP 1 scale
                   FROM ( SELECT TOP 50 PERCENT scale FROM waypoint.dbo.ScoreMaster WHERE scale IS NOT NULL ORDER BY scale ) AS A
                  ORDER BY scale DESC )
             + ( SELECT TOP 1 scale
                   FROM ( SELECT TOP 50 PERCENT scale FROM waypoint.dbo.ScoreMaster WHERE scale IS NOT NULL ORDER BY scale DESC ) AS A
                  ORDER BY scale ASC ) ) / 2.0 AS MedianVal
      ), Mode AS (
      SELECT AVG(scale) AS ModeVal
        FROM waypoint.dbo.ScoreMaster
       WHERE scale IS NOT NULL
      HAVING COUNT(scale) = ( SELECT TOP 1 COUNT(scale)
                                FROM waypoint.dbo.ScoreMaster
                               WHERE scale IS NOT NULL
                               GROUP BY scale
                               ORDER BY COUNT(scale) DESC )
      ) 
      SELECT MeanVal
           , MedianVal
           , ModeVal
        FROM Mean
           , Median
           , Mode
      

      如果您希望 Mode 成为具有最高计数的刻度之间的 AVG。

      【讨论】:

        猜你喜欢
        • 2011-01-24
        • 2016-12-11
        • 2012-01-09
        • 1970-01-01
        • 2018-03-17
        • 2018-07-22
        • 2020-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多