| 
                
Please start any new threads on our new 
    site at https://forums.sqlteam.com.  We've got lots of great SQL Server
    experts to answer whatever question you can come up with. 
    
        | 
                
                    | 
                            
                                | Author | Topic |  
                                    | cidrPosting Yak  Master
 
 
                                        207 Posts | 
                                            
                                            |  Posted - 2010-09-01 : 05:37:12 
 |  
                                            | Hi folks and thanks in advance for any help.This is boggling me a bit.  I have a table that is to do with fault callouts for a company.  If there is a fault in a shop store, an Engineer is called out and this is recorded in the table.I've been asked to identify when a callout for the same store has been made with 48 hours of the last one.  This is to show if an engineer has not corrected the problem and has had to come back out to fix it. This will evaluate Engineers performance.Here is sample data that contains the storeID, the callout dates and always different faultIDs FAultID StoreID  Callout Date627917	014222	2010-04-26 00:00:00.000641874	014222	2010-06-28 00:00:00.0001000278	014222	2010-06-28 16:35:00.0001000301	014222	2010-07-01 17:08:00.0001000395	014222	2010-07-05 12:00:00.0001000322	014222	2010-07-06 07:00:00.0001000398	014222	2010-07-06 08:44:00.000As you can see, there are three sets of dates that are within 48 hours of each other: FaultIDs 641874 and 1000278 are 16.35 hours from each other.  faultIDs 1000395, 1000322 are around 19 hours from each other. Also, 1000322 and 1000398 are aound 1.44 hours from each other.  These five records would be shown with the callout notes to determine if an engineer has not corrected the fault properly and has had to come back out. It should look like this FAultID StoreID  Callout Date641874	014222	2010-06-28 00:00:00.0001000278	014222	2010-06-28 16:35:00.0001000395	014222	2010-07-05 12:00:00.0001000322	014222	2010-07-06 07:00:00.0001000398	014222	2010-07-06 08:44:00.000FaultID 627917 and 1000301 are not included in this report because they're outwith 48 hours of any other dates in the column for that particular store number.I'm very unsure how to do grab only records that fit the above criteria.  Is there anyone that can help me?Many thanks |  |  
                                    | SwePesoPatron Saint of Lost Yaks
 
 
                                    30421 Posts | 
                                        
                                          |  Posted - 2010-09-01 : 08:56:10 
 |  
                                          | And you are using SQL Server 2000? N 56°04'39.26"E 12°55'05.63"
 |  
                                          |  |  |  
                                    | SwePesoPatron Saint of Lost Yaks
 
 
                                    30421 Posts | 
                                        
                                          |  Posted - 2010-09-01 : 09:16:19 
 |  
                                          | [code]DECLARE	@Sample TABLE	(		FaultID INT NOT NULL,		StoreID INT NOT NULL,		CallOut SMALLDATETIME NOT NULL	)INSERT	@SampleSELECT	 627917, 14222, '2010-04-26 00:00' UNION ALLSELECT	 641874, 14222, '2010-06-28 00:00' UNION ALLSELECT	1000278, 14222, '2010-06-28 16:35' UNION ALLSELECT	1000301, 14222, '2010-07-01 17:08' UNION ALLSELECT	1000395, 14222, '2010-07-05 12:00' UNION ALLSELECT	1000322, 14222, '2010-07-06 07:00' UNION ALLSELECT	1000398, 14222, '2010-07-06 08:44'-- Solution hereSELECT DISTINCT	x.FaultID,		x.StoreID,		x.CallOutFROM		(			SELECT	FaultID,				StoreID,				CallOut,				DATEADD(HOUR, -48, CallOut) AS FromTime,				DATEADD(HOUR, 48, CallOut) AS ToTime			FROM	@Sample		) AS sINNER JOIN	@Sample AS x ON x.StoreID = s.StoreIDWHERE		x.CallOut BETWEEN s.FromTime AND s.ToTime		AND x.FaultID <> s.FaultID[/code] N 56°04'39.26"E 12°55'05.63"
 |  
                                          |  |  |  
                                    | cidrPosting Yak  Master
 
 
                                    207 Posts | 
                                        
                                          |  Posted - 2010-09-01 : 11:51:24 
 |  
                                          | Hi Peso,Thanks very much for your help.  I found another way to do it on another forum, however, I think yours works slightly faster.Thanks:) |  
                                          |  |  |  
                                    | SwePesoPatron Saint of Lost Yaks
 
 
                                    30421 Posts | 
                                        
                                          |  Posted - 2010-09-01 : 14:47:13 
 |  
                                          | Please post the other solution for comparison. N 56°04'39.26"E 12°55'05.63"
 |  
                                          |  |  |  
                                    | cidrPosting Yak  Master
 
 
                                    207 Posts | 
                                        
                                          |  Posted - 2010-09-02 : 04:27:08 
 |  
                                          | [code]CREATE TABLE #temp(faultID INT,storeID VARCHAR(6),calloutDate DATETIME)INSERT INTO #tempSELECT 627917, '014222', '04/26/10'UNION ALLSELECT 641874, '014222','06/28/10'UNION ALLSELECT 1000278, '014222', '06/28/10 16:35'UNION ALLSELECT 1000307, '014222','07/01/10 17:08'UNION ALLSELECT 1000395, '014222','07/05/10 12:00'UNION ALLSELECT 1000322, '014222','07/06/10 7:00'UNION ALLSELECT 1000398, '014222','07/06/10 8:44'SELECT * FROM #temp TWHERE EXISTS (SELECT * FROM #temp T2                                 WHERE t.storeID = t2.storeID                                AND t2.calloutDate > t.calloutDate                                AND t2.calloutDate < DATEADD(hh,48,t.calloutDate))unionSELECT * FROM #temp TWHERE EXISTS (SELECT * FROM #temp T2                                WHERE t.storeID = t2.storeID                                AND t2.calloutDate < t.calloutDate                                AND t2.calloutDate > DATEADD(hh,-48,t.calloutDate))ORDER BY T.calloutDateDROP TABLE #temp[/code]The query above touched 98 rows to get the answer, yours touched about 56.  Apparently the one above (and yours I suspect since it uses inequality operater) is called a triangular join and is quite bad for the server. |  
                                          |  |  |  
                                |  |  |  |  |  |