2017-06-19 13 views
0

鉄道会社向けのアプリケーションを開発します。私は条件を特定して平均を計算するのに問題があります。 が良く、私が例に条件付き平均値とオーダー・オラクル

を与える理解するためにここでは、データベースからのデータの例です:

---------check----------------HR---------------Serie-----NameStation 

06/12/2016 05:57:00  06/12/2016 05:57:07  7100 Station A 
06/12/2016 05:59:30  06/12/2016 05:59:40  7100 Station B 
06/12/2016 06:00:00  06/12/2016 06:00:35  7100 Station C 

07/12/2016 05:57:00  07/12/2016 05:56:34  7100 Station A 
07/12/2016 06:00:30  07/12/2016 05:58:59  7100 Station B 
07/12/2016 06:01:00  07/12/2016 05:59:46  7100 Station C 

08/12/2016 05:57:00  08/12/2016 05:56:25  7100 Station A 
08/12/2016 05:59:30  08/12/2016 05:59:28  7100 Station B 
08/12/2016 06:00:00  08/12/2016 06:01:50  7100 Station C 

は私が月を超える各列車のデータを持っています。 。 列車には毎日計画された旅程があります(指定された時刻に3駅を通過する=理論時刻は列のチェックです。タイプはdd/ mm/yyyy hh:mm:ssです)。 私のHR列は列車が列車で実際に通過している時刻で、チェック列と同じ形式のリアルタイムです。

私の目標は、1か月にわたるHRカラムの平均を計算することです。 しかし、1ヶ月以上は、スケジュールの変更が発生します。 3つのステーションの同じルーチン=理論的時間(列チェック)が同じ場合は列HRの平均を計算する必要があります

この例では、セリエー7100には07/12/2016をB局とCで入力すると、06/12/2016と08/12/2016の平均値のみを計算する必要があります。 そして、07/12/2016の平均は、分離しています。 または最もよく再計画された旅程の平均を計算する方が良い(列のチェック時にステーションA + B + Cと同じ時間)。

結果は、それが他の日とステーションAで2016年7月12日の平均を計算しますので、私はGROUP BYを使用しようとしましたが、私はいくつかの情報を失う

check HR  Serie  StationName 
05:57:00 05:56:46 7100 Station A 
05:59:30 05:59:34 7100 Station B 
06:00:00 06:01:13 7100 Station C 

05:57:00 05:56:34 7100 Station A 
06:00:30 05:58:59 7100 Station B 
06:10:00 05:59:46 7100 Station C 

でなければなりません。

両方のステーションで同じルート/同じ時間を持つシリーズがあれば、毎日確認できますか?>平均を計算しますか? または、毎日のルーチンを基準日にまとめることはできますか?

SELECT check, 
     TO_CHAR(TRUNC(SYSDATE) + AVG(HR - TRUNC(HR)), 'HH24:MI:SS') 
     AS "AVG(HR)", 
     serie, 
     name 
GROUP BY check, serie, name 
HAVING COUNT(*) > 1 

は、事前にあなたに感謝:

は、ここに私のコードです。

+1

質問。 'check'(悪いカラム名、それはOracleキーワードと衝突します)と' hr'のデータ型は何ですか?彼らはすべて同じ日付になっていますか(または特定の日付との関連性がない抽象的な時間帯であること)?次に、現在のクエリの問題は何ですか?どの情報を失っていますか? – mathguy

+0

Redha Ben私は「HAVING COUNT(*)> 1」をなぜ疑問に思ったのですか?これは結果セットを、 'CHECK'-'SERIE' -NAME'の同じ組み合わせが複数回現れるレコードのサブセットのみに制限します。私はあなたが一人の代表者しかいないときにアイテムの平均化を避けたいと思っていますが、あなたの欠けているデータに一度現れる 'CHECK'-' SERIE'-'NAME'が含まれているのかどうか疑問に思っていますか?おかげで – alexgibbs

+0

私を助けてくれてありがとう男。私は投稿を編集して、PLZをチェックすることができます。 –

答えて

0

解決策が見つかりました。 ソリューションは、私が

with data as( 
    select t.*,  
    trunc(chck) chck_date,  
    numtodsinterval(chck-trunc(chck), 'DAY') chck_time, 
    dense_rank() over(partition by serie order by chck-trunc(chck)) dr 
    from t  
)  
, data_with_timelist as ( 
    select d.*,  
    listagg(to_char(dr,'fm00X')) within group(order by dr) over(partition by serie, chck_date) dr_list  
    from data d  
)  
select serie, namestation, 
to_char(min(chck_date) + chck_time, 'hh24:mi:ss') chck_time, 
to_char( 
    cast( 
     to_timestamp(min(chck_date)) + chck_time + numtodsinterval(avg(hr-chck), 'DAY') 
     as timestamp(0) 
    ) 
    , 'hh24:mi:ss' 
) avg_hr_time 
from data_with_timelist  
group by serie, dr_list, chck_time, namestation  
order by serie, dr_list, chck_time, namestation; 

    SERIE NAMESTATION   CHCK_TIM AVG_HR_T 
---------- ---------------------- -------- -------- 
     7100 Station A    05:57:00 05:56:46 
     7100 Station B    05:59:30 05:59:34 
     7100 Station C    06:00:00 06:01:13 
     7100 Station A    05:57:00 05:56:34 
     7100 Station B    06:00:30 05:58:59 
     7100 Station C    06:10:00 05:59:46 
により、各行に、私のグループの後に各列車の列チェック(data_with_timelist)のすべての時間を入れて、列を追加することです。同じ問題を抱えているだろう人のための

関連する問題