2010-12-22 16 views
0

I-Daten in meiner Datenbank, die wie folgt aussieht:einen Teil eines Datenwerts in meiner SQL-Abfrage verwendet

Date (DateTime)  Type (varchar) Data (varchar) 
2010/12/22 6:00  Geofence  Area 1,1 
2010/12/22 7:00  Geofence  Area 1,0 
2010/12/22 7:30  Geofence  Area 2,1 
2010/12/22 7:45  Geofence  Area 2,0 
2010/12/22 8:00  Geofence  Area 3,1 

Wie Sie, für die Art Geofence Daten sehen können, werden die Daten geteilt ein Komma , wobei die erste Hälfte den Namen des Geofence enthält und die zweite Hälfte angibt, ob der Punkt den Geofence betreten oder verlassen hat.

Was ich versuche, ist eine Liste aller neuesten Geofence-Typ-Einträge für jeden Bereich zu bekommen. Mein idealer Ausgang würde wie folgt aussehen:

Date     Type  Data 
2010/12/22 7:00  Geofence Area 1,0 
2010/12/22 7:45  Geofence Area 2,0 
2010/12/22 8:00  Geofence Area 3,1 

Meine hypothetische SQL-Anweisung wie diese ist

SELECT MAX(Date) AS LatestDate, Data 
FROM MyTable 
WHERE Type = 'Geofence' 
GROUP BY FirstHalfOf(Data) 

aussehen würde es möglich, diese zu halten diese gleiche Tabellenstruktur zu tun?

Ich bin mit MS SQL Server 2008

Dank

P. S. Wie gewünscht, hier einig SQL-Code eine Tabelle zu erstellen und es mit den Beispieldaten füllen:

CREATE TABLE TestData (
    id int PRIMARY KEY IDENTITY, 
    Date datetime NOT NULL, 
    Type varchar(50) NOT NULL, 
    Data varchar(max) NULL) 

INSERT INTO TestData (Date, Type, Data) 
VALUES('2010/12/22 6:00', 'Geofence', 'Area 1,1') 
INSERT INTO TestData (Date, Type, Data) 
VALUES('2010/12/22 7:00', 'Geofence', 'Area 1,0') 
INSERT INTO TestData (Date, Type, Data) 
VALUES('2010/12/22 7:30', 'Geofence', 'Area 2,1') 
INSERT INTO TestData (Date, Type, Data) 
VALUES('2010/12/22 7:45', 'Geofence', 'Area 2,0') 
INSERT INTO TestData (Date, Type, Data) 
VALUES('2010/12/22 8:00', 'Geofence', 'Area 3,1') 
+2

Damit wir Ihnen eine Lösung leicht erstellen. Es wäre sehr vorteilhaft für uns, wenn Sie SQL erstellen würden, um eine Tabelle zu erstellen und diese mit Ihren Daten zu füllen. Auf diese Weise könnten wir faul sein und es in ein Abfragefenster einfügen und das SQL danach erstellen. SSMSTools wird dies für Sie tun, wenn Sie mit der rechten Maustaste auf Ihre Ergebnisse klicken und Skript-Ergebnisse sagen. http://www.ssmstoolspack.com/ –

+0

Tolle Idee. Erledigt. –

Antwort

1

Hier ist die Lösung für MS SQL Server

;WITH cte 
      AS (
       SELECT id, 
         Date, 
         Type, 
         Data, 
         SUBSTRING(Data, 1, CASE WHEN CHARINDEX(',', Data) = 0 
              THEN LEN(Data) 
              ELSE (CHARINDEX(',', Data) - 1) 
              END) AS k 
       FROM  TestData 
      ), 
     counts 
      AS (
       SELECT *, 
         duplicateCount = ROW_NUMBER() 
         OVER (PARTITION BY k ORDER BY k, date desc) 
       FROM  cte 
      ) 
    SELECT * 
    FROM counts 
    WHERE duplicateCount = 1 
1

Dieser für MySQL ist, wird die Teilfunktion von Plattform variieren:

select m.Date, m.Type, m.Data 
from MyTable m 
inner join (
    SELECT SUBSTRING_INDEX(Data, ',', 1) as LeftData, 
     MAX(Date) AS LatestDate 
    FROM MyTable 
    WHERE Type = 'Geofence' 
    GROUP BY SUBSTRING_INDEX(Data, ',', 1) 
) mm on m.Date = mm.LatestDate 
    and SUBSTRING_INDEX(m.Data, ',', 1) = mm.LeftData 
+0

Ich habe vergessen zu erwähnen, dass ich MS SQL benutze. Ich habe online gesucht, um zu sehen, ob MS SQL ein Äquivalent zu SUBSTRING_INDEX hat, aber es sieht so aus als ob es nicht funktioniert und die Leute müssen ihre eigenen (komplex aussehenden!) Funktionen implementieren, um die Schande zu erreichen. –

+0

In MS SQL verwenden Sie charindex. Zum Beispiel SUBSTRING (@str, 1, CASE WANN charindex (',', @str) = 0 THEN len (@ str) ELSE (charindex (',', @str) - 1) ENDE) –