J'ai un problème avec les exigences complexes, j'espère pouvoir obtenir de l'aide pour résoudre ce problème. Ma connaissance SQL est très basique, et je n'ai aucune idée de comment résoudre ce problème. À l'heure actuelle, je une table Events
structuré comme suit:Comment combiner des lignes en une seule ligne dans SQL?
ID | Name | Time | Event Type
----------------------------------------------------------
133000 | Elise | 2016-02-17 06:39:42.000 | Arrival
133000 | Elise | 2016-02-18 06:20:22.000 | Arrival
133000 | Elise | 2016-02-18 20:43:46.000 | Departure
133020 | Elise | 2016-02-19 06:29:46.000 | Arrival
133445 | Peter | 2016-02-01 20:09:00.000 | Departure
133445 | Peter | 2016-02-02 06:32:02.000 | Arrival
133445 | Peter | 2016-02-02 17:03:04.000 | Departure
133445 | Peter | 2016-02-02 19:44:06.000 | Arrival
133445 | Peter | 2016-02-02 19:56:56.000 | Departure
Maintenant, je veux interroger ces données d'une manière de sorte qu'il est structuré de cette façon:
ID | Name | Arrival | Departure
----------------------------------------------------------
133000 | Elise | 2016-02-17 06:39:42.000 | NULL
133000 | Elise | 2016-02-18 06:20:22.000 | 2016-02-18 20:43:46.000
133000 | Elise | 2016-02-19 06:29:46.000 | NULL
133445 | Peter | NULL | 2016-02-01 20:09:00.000
133445 | Peter | 2016-02-02 06:32:02.000 | 2016-02-02 17:03:04.000
133445 | Peter | 2016-02-02 19:44:06.000 | 2016-02-02 19:56:56.000
En d'autres termes, j'ai deux nouvelles colonnes: Arrival
et Departure
. Ensuite, pour chaque personne dans le tableau, appliquer la logique suivante dans l'ordre chronologique:
- Si le
Event Type
estArrival
, il devrait être mis en correspondance avec une nouvelle ligne avec la valeurTime
dans la colonneArrival
. - Si le
Event Type
estDeparture
, vérifiez si la ligne précédente est égalementDeparture
. Si c'est le cas, il doit être mappé à une nouvelle ligne avec la valeurTime
dans la colonneDeparture
etArrival
est null. Si ce n'est pas le cas, il suffit de transférer la valeurTime
dans la colonneDeparture
de la ligne précédente.
Il est préférable que cela puisse se faire via une requête SQL, mais une fonction est également bonne. J'utilise MS SQL Server. Merci!
J'ai dû le changer un petit peu pour utiliser apply au lieu de lag, puisque je suis sur le serveur '08. Mais c'est exactement ce que je voulais. – painiyff