supponga di avere un tale tabella:Combinare intervalli datetime continui per tipo
declare @periods table (
s date,
e date,
t tinyint
);
con intervalli di data senza lacune in ordine di data di inizio (s)
insert into @periods values
('2013-01-01' , '2013-01-02', 3),
('2013-01-02' , '2013-01-04', 1),
('2013-01-04' , '2013-01-05', 1),
('2013-01-05' , '2013-01-06', 2),
('2013-01-06' , '2013-01-07', 2),
('2013-01-07' , '2013-01-08', 2),
('2013-01-08' , '2013-01-09', 1);
Tutti gli intervalli di data hanno tipologie diverse (t).
È necessario combinare intervalli di date dello stesso tipo in cui non siano interrotti da intervalli degli altri tipi (con tutti gli intervalli ordinati per data di inizio).
Quindi la tabella dei risultati dovrebbe essere simile:
s | e | t
------------|------------|-----
2013-01-01 | 2013-01-02 | 3
2013-01-02 | 2013-01-05 | 1
2013-01-05 | 2013-01-08 | 2
2013-01-08 | 2013-01-09 | 1
Delle idee come fare questo senza cursore?
Ho una soluzione di lavoro:
declare @periods table (
s datetime primary key clustered,
e datetime,
t tinyint,
period_number int
);
insert into @periods (s, e, t) values
('2013-01-01' , '2013-01-02', 3),
('2013-01-02' , '2013-01-04', 1),
('2013-01-04' , '2013-01-05', 1),
('2013-01-05' , '2013-01-06', 2),
('2013-01-06' , '2013-01-07', 2),
('2013-01-07' , '2013-01-08', 2),
('2013-01-08' , '2013-01-09', 1);
declare @t tinyint = null;
declare @PeriodNumber int = 0;
declare @anchor date;
update @periods
set period_number = @PeriodNumber,
@PeriodNumber = case
when @t <> t
then @PeriodNumber + 1
else
@PeriodNumber
end,
@t = t,
@anchor = s
option (maxdop 1);
select
s = min(s),
e = max(e),
t = min(t)
from
@periods
group by
period_number
order by
s;
ma dubito se posso contare su un tale comportamento di UPDATE?
Utilizzo SQL Server 2008 R2.
Modifica:
Grazie a Daniele e questo articolo: http://www.sqlservercentral.com/articles/T-SQL/68467/
ho trovato tre cose importanti che sono stati mancati nella soluzione di cui sopra:
- Ci deve essere raggruppati indice sul tavolo
- Ci deve essere una variabile di ancoraggio e la chiamata della colonna cluster
- aggiornamento dichiarazione deve essere eseguito da un processore, vale a dire senza il parallelismo
ho cambiato la soluzione di cui sopra in accordo con queste regole.
Quale versione di SQL Server? –
questa soluzione funziona davvero ...? se tagli il registro ('2013-01-06', '2013-01-07', 2) restituirai lo stesso risultato .. e non avresti visto una riga per ('2013-01-05', '2013- 01-06 ', 2) e altro per (' 2013-01-07 ',' 2013-01-08 ', 2) perché sono interrotti a intervalli? – Frederic
Per Martin Smith: utilizzo SQL Server 2008 R2. A Frederic: Scusa, non ti ho preso abbastanza. Sì, la soluzione di cui sopra funziona, l'ho controllata prima di postare. Una delle condizioni per il compito è che tutti gli intervalli sono continui o successivi, uno dopo l'altro senza spazi. –