Добавление режима к этому SQL - PullRequest
2 голосов
/ 11 января 2010

У меня есть этот SQL для 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

и я хотел бы добавить режим. Я пробовал разные идеи, но пока ничего не работает ...

Ответы [ 4 ]

1 голос
/ 12 января 2010
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, чтобы получить одну шкалу.

Обратите внимание, как мы можем использовать MAX(co.sn) в предложении WHERE:)

1 голос
/ 11 января 2010
0 голосов
/ 12 января 2010

Или это:

; 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 между шкалами с наибольшим количеством.

0 голосов
/ 12 января 2010

Попробуйте это:

; 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

Я знаю, это уродливо, но уловка для перекрестного соединения всех возможных значений, заданных Режим со значением Среднее и Медиана .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...