2

さまざまなユーザーの電話使用時間の合計を取得するクエリがあります...

しかし、私は彼らの使用量の明確な平均を計算できる必要があります..問題は、特定のユーザーが電話を共有していて、電話情報しか取得できないため、通話時間が繰り返され、データが歪む..

したがって、(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  

ご指摘ありがとうございます

これは私が求めている現在のデータの例です(ただし、以下に平均を追加しました。これは私が求めているものです)。一部のユーザーが同じ電話を共有していることがわかりますが、秒数はそれらの間で共有されているため、必要ありません平均に影響を与えるために(11113秒を繰り返したくありません)、電話番号ごとに異なる必要があります..

ここに画像の説明を入力

4

2 に答える 2

2

次のアイデアを実装するソリューションを次に示します。

  1. 電話ごとの合計を取得します ( )。SUM(Duration)

  2. 結果セットを合計期間値でランク付けします ( )。ROW_NUMBEROVER (ORDER BY SUM(Duration))

  3. 合計行数にもう 1 列を含めます ( COUNT(*)OVER ())。

  4. 結果のセットから、平均を取得します ( )。AVG(TotalDuration)

  5. ランキングが次の 2 つの値の平均として中央値を取得します。

    1) N div 2 + 1

    2) N div 2 + N mod 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 のモジュロ演算子は です%

于 2011-08-07T13:49:49.480 に答える
1

これを使用できることを願っています。一時テーブルで行いました

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

ここで試してください: https://data.stackexchange.com/stackoverflow/q/108612/

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

ここで試してください: https://data.stackexchange.com/stackoverflow/q/108611/

于 2011-08-07T13:45:33.590 に答える