SQL查询。。使用DISTINCT和SUM对平均值和中值有一点帮助

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

我有一个查询,以获取不同用户使用手机的总持续时间

但我需要能够计算出它们的使用量的不同平均值。。问题是某些用户共享手机,而我只能获取手机信息,因此通话持续时间会重复,这会扭曲数据

所以我需要一个平均值和一个不同的值(在pin.Number字段上)。。。如果可能的话,做一个中位数也是很有用的

这是当前查询

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)

  • 将中位数作为排名为0的两个值之间的平均值

    1)
    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,平均值要小得多吗?谢谢我能用这个(好吧,一个变量)