web-dev-qa-db-ja.com

10分の時間間隔によるOracleSQLグループの行数

次のようなデータを含む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

どうすればよいですか?

ありがとう

5
woodplease

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;
6

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)
3
Gordon Linoff

答えは次のようになります。

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;
2
Florin Ghita

実際のタイムスタンプ値でグループ化する場合の解決策は次のとおりです。

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;
0
Emil Moise