2017-01-12 27 views
2

各日から最大値Iは、タイムスタンプを持つ列日付を持つテーブルが、秒単位の値とオラクル - 日付/時刻

2017-01-10 06:45:00 PM 1119 
2017-01-10 03:30:00 PM 1054 
2017-01-11 11:15:00 PM 379 
2017-01-10 06:30:00 PM 377 
2017-01-11 09:15:00 PM 375 

クエリ

SELECT 
    TO_char(DtTm,'YYYY-MM-DD hh:mi:ss AM') As DataDt,  
    max(MaxSec) as Wait_sec, DtTimeTable.HrID, 
FROM DtTimeTable 
WHERE DtTimeTable.HrName in ('Dept1', 'Dept2', 'Dept3') 
AND DtTm BETWEEN to_date('2017-01-08 00:00:00', 'YYYY-MM-DD hh24:mi:ss') 
AND to_date('2017-01-10 23:59:59', 'YYYY-MM-DD hh24:mi:ss') 
Group by TO_char(DtTm,'YYYY-MM-DD hh:mi:ss AM'),DtTimeTable.HrID 
order by Wait_sec desc 

のようなクエリを持っていますこれは私にすべてのレコードを与え、もし私が追加すれば、

select * from 
Query1 --(above) 
where rownum <1 order by Wait_sec desc, Datadt desc; 

私は、結果の最高値は、このような何か試してみてください

2017-01-10 06:45:00 PM 1119 
2017-01-11 11:15:00 PM 379 
+0

(名前を表示せずに)2つの列の表を表示しています。しかし、そこから4つの列(HrName、DtTm、MaxSec、HrID)にアクセスします。これは、あなたのクエリが何をしているのか、あなたが何をしたいのかを理解するのを困難にします。 –

+0

投稿にOPが表示するクエリの*出力*は、彼が助けを求めているものに*入力*する必要があります。それでも、そのクエリの*出力*には3つの列(datetimeとvalueに加えてID)が表示されます。彼が最終的にそのIDで何をしたいのかははっきりしていません。 – mathguy

答えて

2

のように日付ごとDatewithTime、MAXVALUEを取得できますか

を設定取得しています:それは日付内の行番号を割り当てる

Select * 
From (
    Select t.*, 
     Row_number() over(partition by trunc(datecol) order by value desc nulls last) rn 
    From yourtable t 
) where rn = 1; 

を値の列を降順に基にして最初の行を取得するフィルタ

+1

@vkp nope。 OPは最大値を持つ行を取得します。 – GurV

+0

あなたは正しいです。私は質問を誤解しました。 –

+0

@GurV ..たくさんありがとう..完璧な解決策:) – SamP

2

以下の解決方法では、グループ化のMAX()集約関数、およびFIRST/LAST関数(KEEP DENSE_RANK)を使用します。日付が同じ最高値に2回以上到達した場合は、その日に値に達した最初の時刻が選択されます。

with 
    test_data(dt, val) as (
     select to_date('2017-01-10 06:45:00 PM', 'yyyy-mm-dd hh:mi:ss AM'), 1119 from dual 
     union all 
     select to_date('2017-01-10 03:30:00 PM', 'yyyy-mm-dd hh:mi:ss AM'), 1054 from dual 
     union all 
     select to_date('2017-01-11 11:15:00 PM', 'yyyy-mm-dd hh:mi:ss AM'), 379 from dual 
     union all 
     select to_date('2017-01-10 06:30:00 PM', 'yyyy-mm-dd hh:mi:ss AM'), 377 from dual 
     union all 
     select to_date('2017-01-11 09:15:00 PM', 'yyyy-mm-dd hh:mi:ss AM'), 375 from dual 
    ) 
-- end of test data; SQL query begins below this line (use actual table and column names) 
select min(dt) keep(dense_rank last order by val) as dt, max(val) as val 
from test_data 
group by trunc(dt) 
order by dt -- if needed 
; 

DT       VAL 
---------------------- ---------- 
2017-01-10 06:45:00 PM  1119 
2017-01-11 11:15:00 PM  379 

2 rows selected.