次のようなデータを含むOracleのテーブルがあります
created_dateの詳細 01-Jan-16 04:45 abcd 01-Jan-16 04:47 efgh 01-Jan-16 04:53 ijkl 2016年1月1日04:54mnop 16年1月1日04:58qrst
....等
10分ごとにテーブルの行数をカウントできるようにしたいです。
時間カウント 04:40 2 04:50 3
作成日=タイムスタンプ、詳細= varchar
どうすればよいですか?
ありがとう
TO_CHARおよびSUBSTRを使用して、時間文字列を作成できます。
select
substr(to_char(created_date, 'hh24:mi'), 1, 4) || '0' as created,
count(*)
from mytable
group by substr(to_char(created_date, 'hh24:mi'), 1, 4) || '0'
order by substr(to_char(created_date, 'hh24:mi'), 1, 4) || '0';
または、サブクエリ(派生テーブル)を使用して、日付式を1回だけ書き込む必要があります。
select created, count(*)
from
(
select substr(to_char(created_date, 'hh24:mi'), 1, 4) || '0' as created
from mytable
)
group by created
order by created;
1つの方法は、時と分を抽出して算術演算を行うことです。
select extract(hour from created_date) as hh,
floor(extract(minute from created_date) / 6) as min,
count(*)
from t
group by extract(hour from created_date),
floor(extract(minute from created_date) / 6)
答えは次のようになります。
select trunc(sysdate, 'hh')+ trunc(to_char(sysdate,'mi')/10)*10/1440 from dual;
Sysdateを実際の日付/タイムスタンプ列に置き換え、dualをテーブルに置き換えることができます
コンポーネントを理解するには、次のコマンドを実行します。
select trunc(sysdate, 'hh') the_hour,
to_char(sysdate,'mi') the_minutes,
trunc(to_char(sysdate,'mi')/10)*10 minutes_truncated,
trunc(to_char(sysdate,'mi')/10)*10/1440 part_of_the_day, --as 1 represents a day in Oracle datetime system
trunc(sysdate, 'hh')+ trunc(to_char(sysdate,'mi')/10)*10/1440 result
from dual;
実際のタイムスタンプ値でグループ化する場合の解決策は次のとおりです。
create table test_10_minutes_group_by (created_date timestamp, details varchar2(4));
insert into test_10_minutes_group_by values (systimestamp, 'aaa'); -- current time
insert into test_10_minutes_group_by values (systimestamp - 1/24/60, 'bbb'); -- 1 minute ago
insert into test_10_minutes_group_by values (systimestamp - 1/24/60 * 10, 'ccc'); -- 10 minutes ago
insert into test_10_minutes_group_by values (systimestamp - 1/24/60 * 20, 'ccc2'); -- 20 minutes ago
insert into test_10_minutes_group_by values (systimestamp - 1/24/60 * 25, 'abc'); -- 25 minutes ago
insert into test_10_minutes_group_by values (systimestamp - 1/24/60 * 30, 'xyz'); -- 30 minutes ago
insert into test_10_minutes_group_by values (systimestamp - 1/24/60 * 35, 'xyz2'); -- 35 minutes ago
select
actual_time,
to_char(actual_time, 'hh24:mi:ss') pretty_date,
count(1)
from (
select
trunc(created_date, 'mi') /*remove seconds*/ - 1/24/60 * mod(extract (minute from created_date), 10) /*substract units digit from minutes*/ actual_time,
details
from
test_10_minutes_group_by
)
group by actual_time;