Sql server 向此SQL添加模式
我有此SQL for MS SQL Server 2008: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_
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的行为如何?当有两种以上的模式时?