2009-07-15 7 views
0

Das wird wie eine lahme Frage für alle Experten in SQL Server Ansichten erscheinen, aber ...SQL-Abfrage: Zeitdifferenz

Also habe ich eine kleine Menge von Daten, die mein Mandant für Berichtszwecke benötigt. Ich muss zugeben, dass ich zwar ihre Berichtspflichten gestellt habe, aber bis jetzt sehe ich, dass meine db besser optimiert werden kann.

Eines der Stücke von Daten, die sie wollen, ist die Zeitdifferenz zwischen zwei Aufgaben, die ausgeführt haben:

select caseid, hy.createdate 
from app_history hy 
where hy.activityid in (303734, 303724) 

Das gibt mir zwei Reihen (nach edit) pro Fall-Vorlage, die dann gemessen werden müssen ; aber ein paar Wackeln: Aktivität 303734 wird immer ausgeführt, Aktivität 303724 könnte ausgeführt werden. Die Kombinationen 303734 und 303724 entsprechen einander. Vorrausgesetzt ein Fall kann 1 un-matched 303734 mit einem zusammenpassenden Paar danach auf der 2. Vorlage haben. Das Zusammenpassen könnte auf Intuition zurückzuführen sein. Nicht gut. Es gibt möglicherweise mehr als eine Einreichung pro caseid und wenn dies der Fall ist, werden beide Aktivitäten jedes Mal ausgeführt. Es gibt keine Möglichkeit, die Übermittlungsnummer in diese Tabelle zu schreiben.

Die Tabelle app_history enthält userid, caseid und activityid als Fremdschlüssel. Die PK ist die Identitätsspalten-ID.

Gibt es eine bessere Möglichkeit, die Abfrage zu schreiben?

AFter Hilfe von KM:

select 
    c.id, c.submissionno, hya.caseid, hya.createtime, hyb.caseid, hyb.createtime 
    ,CASE 
     WHEN hyb.caseid IS NOT NULL THEN DATEDIFF(mi,hya.createtime,hyb.createtime) 
     ELSE NULL 
    END AS Difference 
    from app_case c 
     inner join app_history hya on c.id = hya.caseid 
     left outer join app_history hyb on c.id = hyb.caseid 
    where hya.activityid in (303734) and hyb.activityid in (303724) order by c.id asc 

Das funktioniert fast.

Ich habe jetzt das Problem:

460509|2|460509|15:15:39.000|460509|15:16:13.000|1 
460509|2|460509|15:15:39.000|460509|15:18:13.000|3 
460509|2|460509|15:17:52.000|460509|15:16:13.000|-1 
460509|2|460509|15:17:52.000|460509|15:18:13.000|1 

So bin ich jetzt 1 Reihe bekommen jeder der beiden für jede der vier Reihen zu vergleichen ... mmm Ich denke, es ist das Beste ich hoffen kann. :(

+0

Wenn Sie „immer sagen run "and" might run ", bedeutet das, dass" createate "nicht gesetzt wurde/ist" NULL "? –

+0

Wenn die Aktivität nicht ausgeführt wird, wird sie nicht in die Tabelle app.history geschrieben. – Sean

+0

welche Version von SQL Server und was ist die PK von app_history (ist es eine Identität?) –

Antwort

1

USE LEFT JOIN

SELECT 
    a.caseid, a.createdate 
     ,b.caseid, b.createdate 
     ,CASE 
      WHEN b.caseid IS NOT NULL THEN DATEDIFF(mi,a.createdate,b.createdate) 
      ELSE NULL 
     END AS Difference 
    FROM app_history    a 
     LEFT OUTER JOIN app_history b ON b.activityid=303724 
    WHERE a.activityid=303734 

EDIT nach ein wenig mehr Schema Info ...

SELECT 
    a.caseid, a.createdate 
     ,b.caseid, b.createdate 
     ,CASE 
      WHEN b.caseid IS NOT NULL THEN DATEDIFF(mi,a.createdate,b.createdate) 
      ELSE NULL 
     END AS Difference 
    FROM (SELECT MAX(ID) AS MaxID FROM app_history WHERE activityid=303734)     aa 
     INNER JOIN app_history                a ON aa.MaxID=a.ID 
     LEFT OUTER JOIN a(SELECT MAX(ID) AS MaxID FROM app_history WHERE activityid=303724) bb ON 1=1 
     LEFT OUTER JOIN app_history               b ON bb.MaxID=b.ID 
+0

Das sieht gut aus, danke KM. – Sean

+0

Eigentlich denke ich, dass das nicht funktioniert ... Nicht so, wie ich es sowieso erwarte. Es scheint, jede 'b' Reihe mit jeder 'a' Reihe zu vergleichen. – Sean

+0

Hallo, ich habe nur 3649 Zeilen in der App.History in Dev. Ich bekomme 55605 Zeilen mit der obigen Abfrage zurückgegeben. – Sean

0

tun so etwas wie dieses


select datediff(
day, 
(select isnull(hy.createdate,0) from app_history hy where hy.activityid =303734), 
(select isnull(hy.createdate,0) from app_history hy where hy.activityid =303724) 
) 
Verwandte Themen