计算聚合行的中位数?? SQL

时间:2018-04-11 13:03:22

标签: sql sql-server-2012

我的表格如下所示

Name          Date          Hour     Score 
Bob       01 jan 2018        9       0
Bob       01 jan 2018        10      0
Bob       01 jan 2018        11      3.03
Bob       01 jan 2018        11      3.43
Bob       01 jan 2018        12      0
Bob       01 jan 2018        13      0

现在有一个包运行并聚合此表中的所有内容,因此每个Name每小时有1行和1个日期,所有其他值汇总起来。一旦运行,表格如下所示

Name          Date          Hour     Score 
Bob       01 jan 2018        9       0
Bob       01 jan 2018        10      0
Bob       01 jan 2018        11      3.23
Bob       01 jan 2018        12      0
Bob       01 jan 2018        13      0

如您所见,两个重复列的得分均已平均。副本存在,因为用户在同一天的同一小时内收到的分数超过1分。

我被要求将其作为中位数而不是平均数 - 这是否可行?根据我的理解,为了让我们获得中位数,我们需要能够计算所有不同的分数,然后选择中间分数 - 如果所有内容都汇总到1行,我们怎么做呢?上述示例的中位数实际应为0。

这很容易用SQL吗? 感谢

3 个答案:

答案 0 :(得分:0)

您可以使用PERCENTILE_DISC(0.5)对初始数据集执行中位数:https://docs.microsoft.com/en-us/sql/t-sql/functions/percentile-disc-transact-sql

但是,如果数据已经汇总到平均值并且您丢失了初始数据集,那么在这种情况下您将无法再进行中位数计算。

答案 1 :(得分:0)

这很有趣,请查看:)

IF OBJECT_ID('tempdb..#media') IS NOT NULL DROP TABLE #media
CREATE TABLE #media(name nvarchar(100), [date] date not null, [hour] int, score numeric(12,2) not null)

INSERT INTO #media 
VALUES
    ('Bob','2018-04-12',9,0),
    ('Bob','2018-04-12',10,0),
    ('Bob','2018-04-12',11,3.03),
    ('Bob','2018-04-12',11,3.43),
    ('Bob','2018-04-12',12,0),
    ('Bob','2018-04-12',13,0),
    ('Bob','2018-04-12',23,11),
    ('Bob','2018-04-12',23,12),
    ('Bob','2018-04-12',23,13),
    ('Bob','2018-04-12',23,14),
    ('Bob','2018-04-12',23,15),
    ('Bob','2018-04-12',23,19),
    ('Bob','2018-04-12',22,21),
    ('Bob','2018-04-12',22,22),
    ('Bob','2018-04-12',22,22)

SELECT * FROM #media ORDER BY name,[date],[hour]

SELECT 
    DISTINCT
    name,[date],[hour],
    (PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY score)   OVER (PARTITION BY name,[date],[hour])) as score_media
FROM #media

IF OBJECT_ID('tempdb..#media') IS NOT NULL DROP TABLE #media

之前的数据

name    date    hour    score
Bob 2018-04-12  9   0.00
Bob 2018-04-12  10  0.00
Bob 2018-04-12  11  3.03
Bob 2018-04-12  11  3.43
Bob 2018-04-12  12  0.00
Bob 2018-04-12  13  0.00
Bob 2018-04-12  22  21.00
Bob 2018-04-12  22  22.00
Bob 2018-04-12  22  22.00
Bob 2018-04-12  23  11.00
Bob 2018-04-12  23  12.00
Bob 2018-04-12  23  13.00
Bob 2018-04-12  23  14.00
Bob 2018-04-12  23  15.00
Bob 2018-04-12  23  19.00

之后的数据
name    date    hour    score_media
Bob 2018-04-12  9   0.00
Bob 2018-04-12  10  0.00
Bob 2018-04-12  11  3.03
Bob 2018-04-12  12  0.00
Bob 2018-04-12  13  0.00
Bob 2018-04-12  22  22.00
Bob 2018-04-12  23  13.00

答案 2 :(得分:-1)

希望这是你想要的

select name, date, hour, avg(score)
from table
group by name, date, hour;