2016-04-07 10 views
2

Ich versuche, Zeilen aus meiner Abfrage aufgrund der folgenden Bedingung auszuschließen.DATEDIFF basierend auf ID in WHERE-Klausel

  1. Calculate the time difference between EID of 33 and 49
  2. If the total seconds is less than 35 exclude them from query
SELECT c1.* FROM CTE2 C2 
INNER JOIN CTE C1 
ON C2.ID = C1.ID 
AND c1.EID IN (33,49) 
ORDER BY C1.ID, C1.DateTime 

Meine Daten können mehrere Zeilen für die gleiche ID mit duplizierten EID=33 enthalten, aber es wird immer ein EID=49 haben. Also interessiert mich last record für ID minus previous Zeile für die gleiche ID. Wenn es weniger als 35 Sekunden ist, schließen Sie diese ID aus den Ergebnissen aus.

Ich habe versucht, mit Lag Funktion und das Hinzufügen eines AND Anweisung der Abfrage oben

AND DATEDIFF(SECOND, DateTime, LAG(datetime) OVER (ORDER BY id, datetime)) < 35 

Aber ich erhalte den folgenden Fehler:

Windowed functions can only appear in the SELECT or ORDER BY clauses.

Ich versuche haben einen anderen Ansatz:

;with cte AS 
(
    SELECT *,ROW_NUMBER() OVER(PARTITION BY id ORDER BY DateTime) AS RN 
    FROM @cte WHERE eid IN (33,49) 
) 
SELECT a.*, DATEDIFF(SECOND,a.datetime, b.DateTime) AS diff 
FROM cte a 
LEFT JOIN cte b 
ON a.id = b.id 
AND a.RN = b.RN -1 
AND DATEDIFF(second, a.DateTime, b.DateTime) < 35 

Aber das gibt mir immer noch die correc t Daten.

Hier ist ein Beispiel Datensätze.

enter image description here

Auf dieser Basis zeichnet sie nur ID=12345 und ID=54321 ausschließen zurückkehren sollte, da die Differenz nur 12 Sekunden ist.

Irgendwelche Vorschläge?

UPDATE

Ich bin ein SQLFIDDLE erstellen nicht in der Lage. Hier ist ein SCRIPT zum Erstellen einer TEMP-Tabelle.

DECLARE @cte as table 
(
    ID Char (5), 
    [DateTime] DateTime, 
    EID integer 
) 

INSERT INTO @cte 
VALUES 
(N'12345', N'2016-03-15 13:14:57.000', 1), 
(N'12345', N'2016-03-15 13:15:01.000', 2), 
(N'12345', N'2016-03-15 13:15:12.000', 5), 
(N'12345', N'2016-03-15 13:15:13.000', 12), 
(N'12345', N'2016-03-15 13:15:13.000', 13), 
(N'12345', N'2016-03-15 13:15:27.000', 16), 
(N'12345', N'2016-03-15 13:15:27.000', 22), 
(N'12345', N'2016-03-15 13:15:27.000', 23), 
(N'12345', N'2016-03-15 13:15:39.000', 26), 
(N'12345', N'2016-03-15 13:15:39.000', 32), 
(N'12345', N'2016-03-15 13:15:42.000', 52), 
(N'12345', N'2016-03-15 13:15:42.000', 33), 
(N'12345', N'2016-03-15 13:15:52.000', 48), 
(N'12345', N'2016-03-15 13:16:37.000', 33), 
(N'12345', N'2016-03-15 13:17:13.000', 35), 
(N'12345', N'2016-03-15 13:17:13.000', 49), 
(N'54321', N'2016-03-24 20:55:30.000', 1), 
(N'54321', N'2016-03-24 20:55:30.000', 50), 
(N'54321', N'2016-03-24 20:55:32.000', 2), 
(N'54321', N'2016-03-24 20:56:30.000', 5), 
(N'54321', N'2016-03-24 20:56:30.000', 12), 
(N'54321', N'2016-03-24 20:56:30.000', 13), 
(N'54321', N'2016-03-24 20:57:44.000', 16), 
(N'54321', N'2016-03-24 20:57:44.000', 22), 
(N'54321', N'2016-03-24 20:57:44.000', 23), 
(N'54321', N'2016-03-24 20:57:56.000', 26), 
(N'54321', N'2016-03-24 20:57:56.000', 32), 
(N'54321', N'2016-03-24 20:57:59.000', 52), 
(N'54321', N'2016-03-24 20:58:54.000', 33), 
(N'54321', N'2016-03-24 20:59:06.000', 35), 
(N'54321', N'2016-03-24 20:59:06.000', 49) 
+0

Bitte legen Sie eine Geige für uns zu arbeiten mit. Danke –

+0

Ich tue es immer, und ich habe es versucht, aber die Seite antwortet überhaupt nicht. – smr5

+0

Ich verstehe. Fügen Sie einfach das 'CREATE'- und' INSERT'-Skript als Teil der Frage ein. –

Antwort

4

Wie wäre es nur mit Aggregation? Unter der Annahme, dass die 33s sind immer vor dem 49 (was der Fall auf der Grundlage der Beispieldaten zu sein scheint):

select id 
from @cte 
group by id 
having datediff(second, 
       max(case when eid = 33 then datetime end), 
       max(case when eid = 49 then datetime end) 
       ) < 35; 
+0

Danke! Das habe ich gesucht. Die einzige Sache in "datediff" der erste Parameter sollte "Sekunde" nicht "Sekunden" sein. – smr5

1

Bedingte Aggregation und IN:

WITH Cte AS(
    SELECT 
     ID, 
     MAX33 = MAX(CASE WHEN EID = 33 THEN DateTime END), 
     MAX49 = MAX(CASE WHEN EID = 49 THEN DateTime END) 
    FROM @cte 
    WHERE EID IN(33, 49) 
    GROUP BY ID 
) 
SELECT * 
FROM @cte 
WHERE ID IN(
    SELECT ID 
    FROM Cte 
    WHERE ABS(DATEDIFF(SECOND, MAX33, MAX49)) >= 35 
)