Trouver la valeur dupliquée et prendre la différence avec d'autres valeurs avec Excel / SQL

J'ai un problème très étrange. J'ai beaucoup de données avec des colonnes de dates, une colonne d'identification etc. Je veux prendre la différence de time de 2 dates (où les dates sont signalées au 16/07/2017 18:42) dans les deux colonnes. En première instance, il est facile de prendre une différence simple, mais le problème ici est la colonne ID. Dans la colonne ID, il y a beaucoup d'ID où les ID sont également dupliqués. Voici donc les conditions suivantes:

  1. Prenez la différence de date et heure où la première rangée d'ID. Comme A2-B2
  2. Lorsque le même identifiant revient, prenez la différence de Date alors la différence serait comme B2-A3. Mais l'ID devrait être du même groupe.

Voici les lignes:

ID Date 1 Date 2 5AB80D3A 7/10/2017 14:16 7/14/2017 11:38 5AB80D3A 7/14/2017 11:38 7/14/2017 12:48 5AB80D3A 7/14/2017 13:00 7/14/2017 19:09 5AB80D3A 7/14/2017 19:09 7/14/2017 21:09 5AB80D 7/14/2017 19:09 7/14/2017 21:09 5AB80D 7/14/2017 19:09 7/14/2017 21:09 5AB80A 7/14/2017 19:09 7/14/2017 21:09 

Si cela peut être fait dans excel / SQL, il sera utile. Merci d'avance pour vos conseils.

Jetez un oeil à la requête ci-dessous. Cela pourrait vous aider à faire ce que vous voulez.

  ;with Testdata as (select Id,Date1 ,Date2 ,ROW_NUMBER() over(partition by Id order by Date1) rowNumber from Q1 ) select currentData.ID,currentData.Date1,currentData.Date2 ,case when currentData.rowNumber=1 then datediff(MINUTE,currentData.Date1,currentData.Date2) else datediff(MINUTE,currentData.Date1,prevData.Date2) End Diffs from testData currentData left join Testdata prevData on currentData.ID=prevData.ID and currentData.rowNumber=prevData.rowNumber+1 

modifier

Après avoir répondu à vos commentaires, j'obtiens la requête suivante, j'espère que cela vous aidera

  ;with Testdata as (select Id,Date1 ,Date2 ,ROW_NUMBER() over(partition by Id order by Date1) rowNumber from Q1 ) select currentData.ID,currentData.Date1,currentData.Date2 ,case when currentData.rowNumber=1 then datediff(MINUTE,currentData.Date1,currentData.Date2) else datediff(MINUTE,currentData.Date2,nextData.Date1) End Diffs from testData currentData left join Testdata nextData on currentData.ID=nextData.ID and currentData.rowNumber=nextData.rowNumber-1 

Edit2 (en utilisant row_number & order by Date1 Descendant pour get la dernière ligne pour chaque ID)

  ;with Testdata as (select Id,Date1 ,Date2 ,ROW_NUMBER() over(partition by Id order by Date1) rowNumber ,ROW_NUMBER() over(partition by Id order by Date2) rowNumberDesc from Q1 ) select currentData.ID,currentData.Date1,currentData.Date2 ,case when currentData.rowNumber=1 or currentData.rowNumberDesc=1 then datediff(MINUTE,currentData.Date1,currentData.Date2) else datediff(MINUTE,currentData.Date2,nextData.Date1) End Diffs from testData currentData left join Testdata nextData on currentData.ID=nextData.ID and currentData.rowNumber=nextData.rowNumber-1