
Originariamente inviata da
softecparma
Sembra funzionare! Fantastico!
Cercher� di studiarmi cosa fa esattamente la query
Grazie mille!
non sapevo se avevi gi� risolto, questa � una versione rivista e corretta che lavora meglio,
Codice PHP:
WITH t1 AS
(
select Batch, LocalTimeCol, StateCurrent,
ROW_NUMBER() OVER (ORDER BY Batch, LocalTimeCol) AS myRank
from tabella
),
t2 as
(
select Batch, LocalTimeCol, StateCurrent, myRank, TakeIt
from
(
select t1.Batch, t1.LocalTimeCol, t1.StateCurrent, t1.myRank,
CASE WHEN t1a.StateCurrent = t1.StateCurrent THEN 0 ELSE 1 END as TakeIt
FROM t1
FULL OUTER JOIN t1 as t1a ON t1.myRank = t1a.myRank + 1
) t3
where StateCurrent is not null
and ( TakeIt = 1 or myRank = ( select max(myRank) from t1 ) )
)
select
t2.Batch,
t2.LocalTimeCol as Dalle,
min(t2a.LocalTimeCol) as Alle,
t2.StateCurrent
from t2
inner join t2 as t2a ON t2.Batch=t2a.Batch and t2a.myRank > t2.myRank
group by t2.Batch, t2.LocalTimeCol, t2.StateCurrent
order by t2.Batch, t2.LocalTimeCol, t2.StateCurrent
risultato,
Batch Dalle Alle StateCurrent
719664 2017-02-17 13:10:50.000 2017-02-17 13:11:00.000 18
719664 2017-02-17 13:11:00.000 2017-02-17 13:11:10.000 0
719664 2017-02-17 13:11:10.000 2017-02-17 13:12:10.000 6
719664 2017-02-17 13:12:10.000 2017-02-17 13:12:20.000 18
719664 2017-02-17 13:12:20.000 2017-02-17 13:12:30.000 6
il funzionamento � relativamente semplice, delle 4 select lavorano nell'ordine,
la prima seleziona i record aggiungendo il rank ovvero numerandoli progressivamente
la terza identifica, dal set precedente, i record da utilizzare con la colonna TakeIt
la seconda prende i record "TakeIt" + l'ultimo
la quarta associa la data "Alle" usando il rank opportunamente
ps forse non sono necessari i confronti sulla colonna batch, perch�
probabilmente batch diversi possono contenere comunque LocalTimeCol successive