2014-12-28 9 views
6

ho avuto l'insieme di dati come seguirenumero Ripristino riga in base al cambiamento dei dati record di

name date 
x  2014-01-01 
x  2014-01-02 
y  2014-01-03 
x  2014-01-04 

e sto cercando di ottenere questo risultato

name date   row_num 
x  2014-01-01  1 
x  2014-01-02  2 
y  2014-01-03  1 
x  2014-01-04  1 

ho provato per eseguire la query

select name, 
     date, 
     row_number() over (partition by name order by date) as row_num 
from myTBL 

ma purtroppo ottengo questo risultato

012.351.
name date   row_num 
x  2014-01-01  1 
x  2014-01-02  2 
y  2014-01-03  1 
x  2014-01-04  3 

per favore aiuto.

+1

quale database - sql server, oracle ecc.? qual è la logica per assegnare il numero di riga in questo modo? cosa stai cercando di fare finalmente? –

+0

L'istruzione 'partition by' dice che le partizioni sono basate esclusivamente su' name'. Il risultato che hai ottenuto è il risultato che hai richiesto. Il risultato che sembri voler è che le partizioni vengano ripristinate ogni volta che cambia * un * run * di 'name'. Non penso che tu possa farlo con una semplice funzione di finestra. Avrai bisogno di uno o due livelli di subquery. –

+2

Per i futuri utenti, questo rientra nella classe dei problemi noti come [tag: gaps-and-islands]. –

risposta

10

È necessario identificare i gruppi di names che si verificano insieme. Puoi farlo con una differenza di numeri di riga. Quindi, utilizzare il grp per il partizionamento del row_number():

select name, date, 
     row_number() over (partition by name, grp order by date) as row_num 
from (select t.*, 
      (row_number() over (order by date) - 
       row_number() over (partition by name order by date) 
      ) as grp 
     from myTBL t 
    ) t 

per i dati di esempio:

name date   1st row_number 2nd  Grp 
x  2014-01-01   1   1  0 
x  2014-01-02   2   2  0 
y  2014-01-03   3   1  2 
x  2014-01-04   4   3  1 

Questo dovrebbe dare un'idea di come funziona.

+1

Brillante, ha funzionato molto bene. – erezlale

+0

Questa è una soluzione molto utile, perché dovrebbe funzionare su qualsiasi database che supporti 'ROW_NUMBER()' (che è la maggior parte di essi) +1. –

Problemi correlati