590
社区成员
发帖
与我相关
我的任务
分享
CREATE TABLE T1
(
id INT NOT NULL IDENTITY CONSTRAINT PK_T1 PRIMARY KEY,
grp INT NOT NULL,
val INT NOT NULL
);
CREATE INDEX idx_grp_val ON dbo.T1(grp, val);
INSERT INTO dbo.T1(grp, val)
VALUES(1, 30),(1, 10),(1, 100),(2, 65),(2, 60),(2, 65),(2, 10);
SELECT grp, Median = AVG(1.0 * val)
FROM
(
SELECT grp, o.val, rn=ROW_NUMBER() OVER (PARTITION BY grp ORDER BY o.val), c=COUNT(0)OVER(PARTITION BY grp)
FROM t1 AS o
) AS x
WHERE rn IN ((c + 1)/2, (c + 2)/2)
GROUP BY grp;
--SQL Server 2012
SELECT grp, Median=MAX(Median)
FROM
(
SELECT grp, val
,Median=PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY val) OVER (PARTITION BY grp)
FROM t1
) a
GROUP BY grp;
/*
grp Median
----------- ---------------------------------------
1 30.000000
2 62.500000
(2 row(s) affected)
grp Median
----------- ----------------------
1 30
2 62.5
(2 row(s) affected)
*/