2017-10-05 10 views
0

私はまったく成功していないことを一番にしようとしているもう一つの頭痛で、どんなに多くの時間を私はavg(datediff)関数を使用しています。先進的な平均日付ユニークなIDを持つダイヤル

私は以下のようなSQLテーブルを持っています:

ID | PersonID |スタート|終了

1 | 1 | 2006-03-21 00:00:00 | 2007-05-19 00:00:00 |アクティブ
2 | 1 | 2007-05-19 00:00:00 | 2007-05-20 00:00:00 |アクティブ
3 | 2 | 2016-08-24 00:00:00 | 2016-08-25 00:00:00 |アクティブ
4 | 2 | 2005-08-25 00:00:00 | 2016-08-28 00:00:00 |アクティブ
5 | 2 | 2016-08-28 00:00:00 | 2017-10-05 00:00:00 |アクティブ

私の平均滞在滞在日数(日数)はすべてです。人です。

平均日数(EARLIEST開始日とLATEST終了日)(1人の個人IDが複数の有効なステータスを持つ可能性があるため)。

たとえば、最初の開始日は2006-03-21で、最新の終了日は2007-05-20です。彼らの滞在は425日間続いた。

ID番号2の場合はこれを繰り返し、滞在日数は407日です。

テーブルの全員にこれを実行した後、平均滞在時間を得るには、上記の5行の平均を2人のユニークユーザーが416とします。私は102の非常に不正確な平均を返します。

これは意味があると思います。いつものように、あなたが与えるどんな助けも非常に高く評価されます。

+0

結果が信頼できない場合は、datediffの結果を合計し、集計された値の数で除算してください。 – iLikeMySql

+0

これは彼がやりたがっているとは思いません。 – Binarus

+0

@iLikeMySqlはとても簡単に見てくれてありがとう。 – it05jb

答えて

0

なぜそれを試してみません:もちろん

SELECT 
    AVG(DATEDIFF(PersonEnd, PersonStart)) 
FROM 
    (SELECT 
    MIN(Start) AS PersonStart, 
    MAX(End) AS PersonEnd 
    FROM 
    table 
    GROUP BY 
    PersonID) PeriodsPerPerson 

、MySQLは少なくともPersonIDのインデックスを意味速いだけでなくグループ、できMAXMIN速いを計算してできるように、適切なインデックスを持つ必要があり、StartおよびEnd

私はどこでも使用しませんが、内部クエリのエイリアスが本当に必要であることに注意してください。もしあなたがそれを離れてしまうと、少なくともMySQL 5.5(私はそれ以降のバージョンについてはわかりません)ではエラーになるでしょう。

数百万行または数十億行の行がある場合は、上記のように計算をストアドプロシージャまたはバックエンドアプリケーションに移動する方がよい場合があります。

+0

これはありがとう、感謝して、私が探していたものを正確にするようです。 – it05jb

関連する問題