0
id originator revenue date
-- ---------- ------- ----------
1  acme             1 2013-09-15
2  acme             0 2013-09-15
3  acme             4 2013-09-14
4  acme             6 2013-09-13
5  acme            -6 2013-09-13
6  hello            1 2013-09-15
7  hello            0 2013-09-14
8  hello            2 2013-09-13
9  hello            5 2013-09-14

上記の表があります。そして、過去 3 日間の収益に基づいて、オリジネーターによって生成された収益に基づいてランキング列を追加したいと思います

以下のように表示されるフィールド:

originator revenue toprank
---------- ------- -------
hello            8       1
acme             5       2   

2)上記のデータに基づいて、次の基準に基づいて生成された平均収益を計算したいと思います

同じ日付の総収益の合計が 0 (ゼロ) の場合は、平均の計算に含めるべきではありません。

a) オリジネーター acme の平均値は、収益/カウント (収益がゼロ以外の値である日付の数) の合計である必要があるため、(4+1)/2 つまり 2.5

b) オリジネーター ハローの平均値は、収益/カウント (収益がゼロ以外の値である日付の数) の合計である必要があるため、(5+2+1)/3、つまり 2.6666

originator revenue toprank avg(3 days)
---------- ------- ------- -----------
hello            8       1      2.6666
acme             5       2      2.5
4

2 に答える 2

0

平均化時に行を無視するにはAVG、null 値を指定します。NULLIF機能はこれに適しています。

MySQL ではランキングに問題があります。これは、Oracle、MySQL、Teradata などでこれを少し簡単にする分析関数をサポートしていません。最も一般的な回避策は、カウンター変数を使用することです。これには、行の順序付けられたセットが必要です。内部クエリで計算されます。

SELECT originator, TotalRev, Avg3Days, @rnk := @rnk + 1 AS TopRank
FROM (
  SELECT
    originator,
    SUM(revenue) AS TotalRev,
    AVG(NULLIF(revenue, 0)) AS Avg3Days
  FROM myTable
  GROUP BY originator
  ORDER BY TotalRev DESC
) Tots, (SELECT @rnk := 0) Ranks
于 2013-09-17T13:17:30.563 に答える
0

今日の日付から過去 3 日間の値を取得する場合は、次のようにします。

SET @rank=0;

select originator, rev, @rank:=@rank+1 AS rank, avg 
FROM 
(select originator, sum(revenue) as rev, 
AVG(NULLIF(revenue, 0)) as avg
FROM t1
WHERE date >= DATE_ADD(CURDATE(), INTERVAL -3 DAY)
group by originator
order by 2 desc) as t2;

SQL フィドル..

編集:

最も近い日付から過去 3 日間の値を取得する場合は、次のようにします。

SET @rank=0;

select originator, rev, @rank:=@rank+1 AS rank, avg 
from 
(select originator, sum(revenue) as rev, 
AVG(NULLIF(revenue, 0)) as avg
from t1
WHERE date >= DATE_ADD((select max(date) from t1), INTERVAL -3 DAY)
group by originator
order by 2 desc) as t2;

SQL フィドル..

于 2013-09-17T13:23:56.397 に答える