2016-07-11 17 views
0

Sqlite3eine Anzahl von Zeilen erhalten, die Bedingung erfüllen

Aufgabe: einen Datensatz erhalten, die die folgenden Daten enthält - NOTES BESIDE SÄULEN derzeit

SELECT DISTINCT DateTime(Rounded, 'unixepoch') AS RoundedDate, -- Rounded DateTime to the floor hour 
      Count() AS Count, -- Count of items that registered within the above time 
      CAST (avg(Speed) AS INT) AS AverageSpeed, -- Average table.Speed column data within the defined datetime 
      Count() AS SpeederCount -- ?? WTF? [pseudo constraints: if Speed > Speedlimit then +1] 
FROM RawSpeedLane AS sl 
    INNER JOIN 
    SpeedLaneSearchData AS slsd ON slsd.ParentId = sl.Id 
    INNER JOIN 
    Projects AS p ON p.ProjectId = sl.ProjectId 
WHERE sl.ProjectId = 72 
GROUP BY RoundedDate; 

Die SQL oben sehen, ist gibt mir alle Daten, die ich brauche, EXECPT für die letzte Spalte.

Diese letzte Spalte soll die Anzahl der Datensätze sein, die bestimmte Kriterien erfüllen. Der einzige Weg, den ich gefunden habe, um dies erfolgreich zu tun, ist eine Unterabfrage zu erstellen ... Cool? Okay, aber das Problem ist, dass die Unterabfrage 4 Minuten dauert, um gut zu laufen ... Ich sauge an SQL: P Egal wie viele verschiedene Wege ich versucht habe, es zu schreiben, es dauert immer noch.

Hier ist die lange, aber funktionierende Version.

SELECT DISTINCT RoundedDate, 
       Count() AS Count, 
       CAST (avg(Speed) AS INT) AS AverageSpeed, 
       (
        SELECT count() 
         FROM RawSpeedLane AS slr 
        WHERE slr.ProjectId = 72 AND 
          datetime(((strftime('%s', Start) - (strftime('%M', Start) * 60 + strftime('%S', Start)))), 'unixepoch') = sl.RoundedDate AND 
          Speed > p.SpeedLimit 
       ) 
       AS SpeederCount 
    FROM SpeedLaneReportDataView AS sl 
     INNER JOIN 
     Projects AS p ON p.ProjectId = sl.ProjectId 
WHERE sl.ProjectId = 72 
GROUP BY RoundedDate; 

ich zur Zeit habe gerade versucht, dies für die letzte Spalte

(select Count() where sl.Speed > p.SpeedLimit) 

aber wie erwartet, ich habe 1 und 0 im nicht wirklich sicher, was hier zu tun. Hinweise oder Hilfe, die mich in die richtige Richtung führen, werden sehr geschätzt.

Antwort

0

Mit SUM und IIF:

SELECT DISTINCT DateTime(Rounded, 'unixepoch') AS RoundedDate, -- Rounded DateTime to the floor hour 
      Count() AS Count, -- Count of items that registered within the above time 
      CAST (avg(Speed) AS INT) AS AverageSpeed, -- Average table.Speed column data within the defined datetime 
      SUM(IIF(Speed > SpeedLimit, 1, 0)) AS SpeederCount 
FROM RawSpeedLane AS sl 
+0

Arbeitete wie ein Charme. Vielen Dank für Ihre Antwort. –

2

Ich glaube nicht, SQLite eine IIF hat aber CASE funktioniert.

Dies ist eine Antwort auf Backs Antwort, aber ich kann noch nicht kommentieren.

SELECT DISTINCT DateTime(Rounded, 'unixepoch') AS RoundedDate, -- Rounded DateTime to the floor hour 
        Count() AS Count, -- Count of items that registered within the above time 
        CAST (avg(Speed) AS INT) AS AverageSpeed, -- Average table.Speed column data within the defined datetime 
        SUM(CASE WHEN Speed > SpeedLimit THEN 1 ELSE 0 END) AS SpeederCount 
    FROM RawSpeedLane AS sl 
+0

Ja, du hast Recht. SQLite hat kein 'IIF'. 'CASE' ist die richtige Syntax. Danke, dass Sie sich die Antwort angesehen haben. –

Verwandte Themen