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.