Ok, il titolo è un pò strano, ma non sapevo come metterlo meglio ;-)
Ieri un cliente mi ha prospettato una domanda interessante...
Supponiamo di avere una tabella [spostamenti] dove l'utente memorizza i clienti che visita, quindi la data (quando) e la citta (dove).
Supponiamo quindi che io, oggi, memorizzi visite come:
cliente A - mattina - brescia
cliente B - mattina - brescia
cliente C - pomeriggio - milano
cliente D - sera - brescia
...
La domanda è: come faccio a visualizzare le città visitate in modo tale che se faccio più incontri nello stesso luogo la città mi appaia una volta sola?
Ovvero: non mi interessa quanti clienti ho visitato nella città "A", quanto avere sotto mano il percorso (tragitto) fatto...
Interessante... mi sono divertito.
Ecco come risolverei:
USE tempdb
GO
create table spostamenti
(
idRecord int primary key identity(1,1),
data datetime,
citta varchar(30)
)
go
insert spostamenti values ('20070531 9:00:00','brescia')
insert spostamenti values ('20070531 10:00:00','brescia')
insert spostamenti values ('20070531 10:30:00','brescia')
insert spostamenti values ('20070531 12:00:00','milano')
insert spostamenti values ('20070531 14:00:00','brescia')
insert spostamenti values ('20070531 14:10:00','desenzano')
insert spostamenti values ('20070531 14:30:00','brescia')
insert spostamenti values ('20070531 15:00:00','brescia')
insert spostamenti values ('20070531 16:00:00','brescia')
insert spostamenti values ('20070531 17:00:00','verona')
insert spostamenti values ('20070531 19:00:00','brescia')
-- Questa la mia tabella di spostamenti
select * from spostamenti order by data
/*
Risultato:
idRecord data citta
----------- ----------------------- ------------------------------
1 2007-05-31 09:00:00.000 brescia
2 2007-05-31 10:00:00.000 brescia
3 2007-05-31 10:30:00.000 brescia
4 2007-05-31 12:00:00.000 milano
5 2007-05-31 14:00:00.000 brescia
6 2007-05-31 14:10:00.000 desenzano
7 2007-05-31 14:30:00.000 brescia
8 2007-05-31 15:00:00.000 brescia
9 2007-05-31 16:00:00.000 brescia
10 2007-05-31 17:00:00.000 verona
11 2007-05-31 19:00:00.000 brescia
(11 row(s) affected)
*/
-- Questa la tabella con un check per verificare se sono stato più volte o meno
select * , (select count(1) from spostamenti S2 where S2.citta = S1.citta and S2.idRecord = S1.idRecord+1) as N from spostamenti S1
/*
Risultato:
idRecord data citta N
----------- ----------------------- ------------------------------ -----------
1 2007-05-31 09:00:00.000 brescia 1
2 2007-05-31 10:00:00.000 brescia 1
3 2007-05-31 10:30:00.000 brescia 0
4 2007-05-31 12:00:00.000 milano 0
5 2007-05-31 14:00:00.000 brescia 0
6 2007-05-31 14:10:00.000 desenzano 0
7 2007-05-31 14:30:00.000 brescia 1
8 2007-05-31 15:00:00.000 brescia 1
9 2007-05-31 16:00:00.000 brescia 0
10 2007-05-31 17:00:00.000 verona 0
11 2007-05-31 19:00:00.000 brescia 0
(11 row(s) affected)
*/
-- Questo il risultato finale
select citta from
(
select * , (select count(1) from spostamenti S2 where S2.citta = S1.citta and S2.idRecord = S1.idRecord+1) as N from spostamenti S1
) T
where N = 0
order by T.data
drop table spostamenti
go
/*
Risultato:
citta
------------------------------
brescia
milano
brescia
desenzano
brescia
verona
brescia
(7 row(s) affected)
*/
Praticamente con la seconda query siamo in grado di avere le città che hanno la successiva identica con un valore = 1.
In questo modo, filtrando per quel campo = 0, abbiamo solo le città che vogliamo visualizzare.
Diciamo che è un pò il "classico" problema del: "... voglio resettare un contatore al cambio di articolo / fornitore / cliente / ..."
Commenti?