SQL查询。。使用DISTINCT和SUM对平均值和中值有一点帮助
我有一个查询,以获取不同用户使用手机的总持续时间 但我需要能够计算出它们的使用量的不同平均值。。问题是某些用户共享手机,而我只能获取手机信息,因此通话持续时间会重复,这会扭曲数据 所以我需要一个平均值和一个不同的值(在pin.Number字段上)。。。如果可能的话,做一个中位数也是很有用的 这是当前查询SQL查询。。使用DISTINCT和SUM对平均值和中值有一点帮助,sql,sum,distinct,average,median,Sql,Sum,Distinct,Average,Median,我有一个查询,以获取不同用户使用手机的总持续时间 但我需要能够计算出它们的使用量的不同平均值。。问题是某些用户共享手机,而我只能获取手机信息,因此通话持续时间会重复,这会扭曲数据 所以我需要一个平均值和一个不同的值(在pin.Number字段上)。。。如果可能的话,做一个中位数也是很有用的 这是当前查询 SELECT TOP 40 SUM(Duration) AS TotalDuration, c.Caller, oin.Name, oin.Email, pin.Number, oin.PRN
SELECT TOP 40 SUM(Duration) AS TotalDuration, c.Caller, oin.Name, oin.Email, pin.Number, oin.PRN
FROM Calls as c
INNER JOIN Phones as pin On c.caller = pin.id
INNER JOIN officers as oin On pin.id = oin.fk_phones
WHERE Duration <> 0 AND Placed BETWEEN '01/07/2011 00:00:00' AND '20/08/2011 23:59:59'
GROUP BY c.Caller, oin.Name, pin.Number, oin.Email, oin.PRN
ORDER BY TotalDuration DESC
选择前40名总和(持续时间)作为TotalDuration、c.Caller、oin.Name、oin.Email、pin.Number、oin.PRN
从呼叫到c
内部连接电话作为c.caller=pin.id上的pin
在pin.id=oin.fk_电话上作为oin的内部连接
其中,持续时间为0,介于“2011年7月1日00:00:00”和“2011年8月20日23:59:59”之间
按c.呼叫人分组,oin.姓名,pin.号码,oin.电子邮件,oin.PRN
按TotalDuration DESC排序
谢谢你的指点
这是我正在寻找的当前数据的一个例子(但我已经在下面添加了我正在寻找的平均值),因为你可以看到一些用户共享同一部手机,但是他们之间共享了秒数,所以不希望这影响平均值(我不希望重复11113秒),所以每个电话号码上都需要有一个不同的
我希望您可以使用此功能,我是通过临时表实现的
declare @calls table (number char(4), duration int)
declare @officers table(number char(4), name varchar(10))
insert @calls values (3321,1)
insert @calls values (3321,1)
insert @calls values (3321,1)
insert @calls values (3321,42309)
insert @calls values (1235,34555)
insert @calls values (2979,31133)
insert @calls values (2324,24442)
insert @calls values (2345,11113)
insert @calls values (3422,9922)
insert @calls values (3214,8333)
insert @officers values(3321, 'Peter')
insert @officers values(1235, 'Stewie')
insert @officers values(2979, 'Lois')
insert @officers values(2324, 'Brian')
insert @officers values(2345, 'Chris')
insert @officers values(2345, 'Peter')
insert @officers values(3422, 'Frank')
insert @officers values(3214, 'John')
insert @officers values(3214, 'Mark')
Sql获取中值和平均值
;with a as
(
select sum(duration) total_duration, number from @calls group by number
)
select avg(a.total_duration) avg_duration, c.total_duration median_duration from a
cross join (
select top 1 total_duration from (
select top 50 percent total_duration from a order by total_duration desc) b order by
total_duration) c
group by c.total_duration
试试这里:
Sql来获取总持续时间
select o.name, c.total_duration, c.number from @officers o join
(select sum(duration) total_duration, number from @calls group by number) c
on o.number = c.number
order by total_duration desc
试试这里:这里有一个解决方案,它实现了以下想法:
(持续时间)
)OVER(按总和排序(持续时间))
)生成的结果集COUNT(*)
)(TotalDuration)
)N分区2+1
2) N分区2+N模块2
其中,N
是项数,div
是整数除法运算符,mod
是模运算符DECLARE @Calls TABLE (Caller int, Duration int);
INSERT INTO @Calls (Caller, Duration)
SELECT 3, 123 UNION ALL
SELECT 1, 23 UNION ALL
SELECT 2, 15 UNION ALL
SELECT 1, 943 UNION ALL
SELECT 3, 326 UNION ALL
SELECT 3, 74 UNION ALL
SELECT 9, 49 UNION ALL
SELECT 5, 66 UNION ALL
SELECT 4, 56 UNION ALL
SELECT 4, 208 UNION ALL
SELECT 4, 112 UNION ALL
SELECT 5, 521 UNION ALL
SELECT 6, 197 UNION ALL
SELECT 8, 23 UNION ALL
SELECT 7, 22 UNION ALL
SELECT 1, 24 UNION ALL
SELECT 0, 45;
查询:
WITH totals AS (
SELECT
Caller,
TotalDuration = SUM(Duration),
rn = ROW_NUMBER() OVER (ORDER BY SUM(Duration)),
N = COUNT(*) OVER ()
FROM @Calls
GROUP BY Caller
)
SELECT
Average = AVG(TotalDuration),
Median = AVG(CASE WHEN rn IN (N / 2 + 1, N / 2 + N % 2) THEN TotalDuration END)
FROM totals
输出:
Average Median
----------- -----------
282 123
注意:在Transact-SQL中,如果两个操作数都是整数,则表示整数除法。T-SQL中的模运算符是。数据示例和预期输出可能会有所帮助。嗨,安德烈,我已经编辑了我的问题,谢谢。这是SQL Server还是其他RDBMS?当前查询有什么问题?MS SQL 2008和当前查询没有返回平均值。我发布的“结果”只是我想要的输出的一个例子。。。谢谢中位数不是24442,平均值要小得多吗?谢谢我能用这个(好吧,一个变量)