sql - data - Trova utenti che hanno lavorato per 5 giorni consecutivi con intervallo di date in uscita




select con data (3)

Non sono sicuro di aver capito tutto correttamente, ma qualcosa del genere potrebbe farti iniziare:

select emp, 
       sum(diff) as days,
       to_char(min(workdate), 'yyyy-mm-dd') as work_start,
       to_char(max(workdate), 'yyyy-mm-dd') as work_end
from (       
  select *
  from (
    select emp, 
           workdate, 
           code, 
           nvl(workdate - lag(workdate) over (partition by emp, code order by workdate),1) as diff
    from tablename
    where code = 'W'
     and workdate between ...
  ) t1
  where diff = 1 -- only consecutive rows
) t2
group by emp
having sum(diff) = 5

SQLFiddle: http://sqlfiddle.com/#!4/ad7ae/3

Si noti che ho usato la date workdate invece della date in quanto è una cattiva idea utilizzare una parola riservata come nome di colonna.

Ho una tabella con dati simili a quelli di seguito

  Emp  Date        Code     
  ---  --------    ---- 
  E1  11/1/2012    W 
  E1  11/1/2012    V   
  E2  11/1/2012    W   
  E1  11/2/2012    W
  E1  11/3/2012    W
  E1  11/4/2012    W
  E1  11/5/2012    W

Voglio ottenere l'elenco dei dipendenti tra un intervallo di date (ad esempio negli ultimi 3 mesi) che ha lavorato per il codice W in modo uniforme per 5 giorni con l'intervallo di date nell'output. Ogni dipendente può avere più record per un singolo giorno con codici diversi.

L'uscita prevista è

Emp   Date-Range 
---   ----------
 E1   11/1 -11/5

Di seguito è quello che ho provato, ma non mi sono avvicinato affatto all'output che cerco

 SELECT distinct user, MIN(date) startdate, MAX(date) enddate
FROM (SELECT user, date, (TRUNC(date) - ROWNUM) tmpcol
      FROM (SELECT user, date
              FROM tablename
             where date between to_date('10/01/2012','mm/dd/yyyy') and to_date('10/03/2012','mm/dd/yyyy')
             ORDER BY user, date) ot) t
 GROUP BY user, tmpcol
 ORDER BY user, startdate;

Se Emp E1 ha funzionato per 10 giorni consecutivi, dovrebbe essere elencato due volte nell'output con entrambi gli intervalli di date. Se E1 ha funzionato per 9 giorni consecutivi (dall'1 / 11 all'11 / 9), dovrebbe essere elencato una sola volta con l'intervallo di date dall'11 / 1 all'11 / 9.

Ho già visto domande simili ma nessuna ha funzionato esattamente per me. Il mio database è Oracle 10G e non PL / SQL.


Puoi iniziare da qui:

select 
emp, count(*) over (partition by emp, code order by date_worked range interval '5' day preceding) as days_worked_last_5_days
from table
where code='W';

quelle file con days_worked_last_5_days = 5 sono ciò che cerchi.

Vedi questo violino.


Select emp, data-5, data from (SELECT EMP, DATA, WORK,lag, lead, row_number() over(PARTITION BY emp--, DATA 
ORDER BY DATA asc) rn
  FROM (SELECT emp,
               data,
               work,
               LAG (data) OVER (PARTITION BY emp ORDER BY data ASC) LAG,
               LEAD (data) OVER (PARTITION BY emp ORDER BY data ASC) LEAD
          FROM (SELECT emp,
                       data,
                       work,
                       ROW_NUMBER ()
                           OVER (PARTITION BY emp, data ORDER BY data ASC)
                           rn
                  FROM example)
         WHERE rn = 1) a
WHERE a.data + 1 = LEAD AND a.data - 1 = LAG
) WHERE rn = 5

Dove l'esempio di tabella è:

EMP (varchar2), data, 'W' o 'F'