Sql server 向此SQL添加模式

Sql server 向此SQL添加模式,sql-server,Sql Server,我有此SQL for MS SQL Server 2008: 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_

我有此SQL for MS SQL Server 2008:

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
我想添加模式。
我一直在尝试不同的想法,但没有任何效果…

请看以下内容:

试试这个:

; 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
我知道这很难看,但诀窍是将模式给出的所有可能值与平均值和中值交叉连接,或者:

; 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
如果希望模式成为计数最高的刻度之间的平均值

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。。。按
订购以获得单个刻度


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

我找到了该源代码,但我不知道如何将模式SQL合并到我列出的SQL中,因此,我只得到一个可能很棘手的结果集,因为模式可能返回多个值……当碰巧存在一个双峰样本(具有两种模式)时,您希望sql的行为如何?当有两种以上的模式时?