SQL, joindre une table sur elle-même, ordonner par créer dans un certain laps de time

J'ai créé une table avec 4 colonnes et sortingé sur une grande quantité de dataID:

ID Type Item Date AU761201 12.37.47 121212322 2012-07-12 22:21:12 AU761201 12.37.42 157856388 2012-05-12 23:21:05 AU761201 12.37.42 164687782 2009-02-12 12:37:24 BD871015 15.31.62 651564488 2007-10-25 15:12:23 DU551023 19.35.14 048040408 2011-11-05 14:15:23 DU551023 19.35.14 056505654 2011-11-04 23:23:23 . . . . . . . . . . . . . . . . . . . . 

Ce que je veux faire est d'examiner si un "ID" a acheté deux biens identiques (même numéro "Type") dans l'espace de time de 24 heures (DU 551023 dans l'exemple donné) et sortinger les ID pour lesquels cela s'applique.

Mon cerveau est actuellement en train de saigner à cause de ce problème. Toute l'aide est profondément appréciée.

Merci!

Pour MySQL

 SELECT T1.id FROM TableName T1 INNER JOIN TableName T2 ON T1.id = T2.id AND T1.Type = T2.Type AND T1.Item > T2.Item WHERE ABS(HOUR(TIMEDIFF(T1.date, T2.date))) <= 24 

Pour SQL Server

 SELECT T1.id FROM TableName T1 INNER JOIN TableName T2 ON T1.id = T2.id AND T1.Type = T2.Type AND T1.Item > T2.Item WHERE ABS(DATEDIFF(hh, T1.date, T2.date)) <= 24 

D'abord, vous avez besoin d'une key unique dans cette table (quelque chose à distinguer des loggings). Supposons que ce soit Item (sinon changez-le dans T1.Item! = T2.Item).

 select distinct T1.ID from Table T1, Table T2 where T1.ID = T2.ID and T1.Type = T2.Type and Abs(T1.Date - T2.Date) < 1 and T1.Item != T2.Item order by T1.ID 

si son server SQL alors vous pouvez le faire avec existe

 SELECT DISTINCT a.ID FROM MyTable AS a WHERE EXISTS ( SELECT 1 FROM MyTable AS b WHERE a.ID = b.ID AND a.TYPE = b.Type AND ABS(DATEDIFF(hour, a.Date, b.Date)) <= 24 ) ORDER BY a.ID 

ou vous pouvez utiliser la jointure

 SELECT DISTINCT a.ID FROM MyTable AS a INNER JOIN MyTable AS b ON a.ID=b.ID AND a.TYPE=b.Type WHERE ABS(DATEDIFF ( hour , a.Date , b.Date ))<=24 ORDER BY a.ID