SQL: select la différence de date minimale pour chaque groupe

Tous les conseils pour get la différence minimale entre l'heure de début et l'heure de fin par guid avec datatables suivantes dans Microsoft SQL 2014:

id| start time | guid | end time 1 | 2015-04-05 12:00 | a | 2015-04-05 12:30 2 | 2015-04-05 12:10 | a | 2015-04-05 12:15 3 | 2015-04-05 12:20 | a | 2015-04-05 12:30 4 | 2015-04-05 12:30 | b | 2015-04-05 12:35 5 | 2015-04-05 12:40 | b | 2015-04-05 12:55 6 | 2015-04-05 12:50 | c | 2015-04-05 12:55 7 | 2015-04-05 13:00 | c | 2015-04-05 13:25 

la sortie que je cherche est:

 id | start time | guid | end time 2 | 2015-04-05 12:10 | a | 2015-04-05 12:15 4 | 2015-04-05 12:30 | b | 2015-04-05 12:35 6 | 2015-04-05 12:50 | c | 2015-04-05 12:55 

J'ai essayé de grouper par guid et en utilisant la fonction DateDiff, mais cela n'a pas fonctionné.

essayez avec la requête ci-dessous

 ;with CTE as( select id, sttime,guid,endtime row_number() over (partition by guid order by datediff(ss,endtime,sttime)) from tablename ) select * from CTE where rowid =1 

Cette réponse ressemble un peu à la réponse d'Indra, mais il y a une différence significative. N'utilisant pas le datiff, qui échouera si des dates sont plus qu'approximatives 168 années (ou 2147483647 secondes) à part. Aussi corrigé quelques problèmes.

 ;WITH CTE as ( SELECT id, start_time, guid, end_time, row_number() over (partition by guid order by end_time - start_time) rn FROM table ) SELECT id, start_time, guid, end_time FROM CTE WHERE rn = 1 
 WITH CTE ( SELECT *,ROW_NUMBER() OVER(PARTITION BY GUID ORDER BY DATEDIFF(SS,STARTTIME,ENDTIME) ASC) AS RN FROM YOURTABLE ) SELECT * FROM CTE WHERE RN=1 

Utilisez NOT EXIST pour renvoyer une ligne si aucune autre ligne avec le même guid n'a less de datediff:

 select id, start_time, guid, end_time from tablename t1 where not exists (select 1 from tablename t2 where t2.guid = t1.guid and datediff(t2.end_time - t2.start_time) < datediff(t1.end_time - t1.start_time)) 

Notez, je ne connais pas SQL Server, donc vous devrez ajuster le code de datediff ci-dessus.