我的表格如下所示
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吗? 感谢
答案 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;