Oracle SQL riga di gruppo il numero di intervalli di tempo di 10 minuti

Ho una tabella in oracle che contiene i dati, ad esempio il seguente

created_date dettagli 
01-Gen-16 04:45 abcd 
01-Gen-16 04:47 efgh 
01-Gen-16 04:53 ijkl 
01-Gen-16 04:54 mnop 
01-Gen-16 04:58 qrst 

….ecc

Voglio essere in grado di contare il numero di righe nella tabella, per ogni 10 minuti
ad esempio,

Il conteggio del tempo di 
04:40 2 
04:50 3 

Created Date = Timestamp,
dettagli = varchar

Come posso fare questo?

Grazie

Vuoi che questi risultati per una determinata data/intervallo di tempo con i valori 0 per intervalli senza fiammiferi o vuoi per tutto il tempo, ma solo intervalli di almeno una partita?
Inoltre, se si aveva 01-Jan-16 04:45 e 02-Jan-16 04:46, ti aspetteresti di vedere un numero di 2 in un singolo 04:40 righe, o che ci si aspetta di avere 04:40 righe per ogni giorno?

OriginaleL’autore woodplease | 2016-01-11

4 Replies
  1. 2

    Un metodo è quello di estrarre le ore e i minuti e fare di conto:

    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)

    OriginaleL’autore Gordon Linoff

  2. 2

    È possibile utilizzare TO_CHAR e SUBSTR per costruire la stringa di ora:

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

    O con una subquery (una tabella derivata), così come per scrivere la data di espressione solo una volta:

    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;

    OriginaleL’autore Thorsten Kettner

  3. 2

    Una risposta potrebbe essere:

    select trunc(sysdate, 'hh')+ trunc(to_char(sysdate,'mi')/10)*10/1440 from dual;

    È possibile sostituire sysdate con la vostra data di effettiva/colonna timestamp e dual con il vostro tavolo

    Per comprendere le componenti, eseguire:

    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;

    OriginaleL’autore Florin Ghita

  4. 0

    Ecco una soluzione se si vuole fare il gruppo su un effettivo valore del timestamp:

    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;

    OriginaleL’autore Emil Moise

Lascia un commento