2017-10-27 8 views
0

Struggling mit einigen SQL, würde einige Anleitung zu schätzen wissen.Wählen Sie den entsprechenden Wert aus der zweiten Tabelle (Mysql)

Haben zwei Tabellen Protokolle und spüren

logs -

assetid  ts  nodeid status 

1 2017-10-26 14:00:10 73 240 
2 2017-10-26 14:00:06 21 160 
3 2017-10-26 14:00:04 18 230 
4 2017-10-26 14:00:02 19 400 
5 2017-10-26 14:00:00 21 190 
1 2017-10-26 13:20:08 18 20 
2 2017-10-26 13:06:10 20 160 
3 2017-10-26 13:03:04 17 230 

Sinn -

status value 
20  5 
160  37 
190  39 
230  56 
240  58 
400  90 

Der Versuch, die richtige Syntax zu finden, um nur die letzte Aufzeichnung zeigen (in Datumzeit) jeder Assetid und zeigen dann den entsprechenden Wert aus der Sense-Tabelle (basierend auf dem Übereinstimmungsstatus in beiden Tabellen) zu produzieren -

assetid  ts   nodeid  status value 

1 2017-10-26 14:00:10 73  240 58 
2 2017-10-26 14:00:06 21  160 37 
3 2017-10-26 14:00:04 18  230 56 
4 2017-10-26 14:00:02 19  400 90 
5 2017-10-26 14:00:00 21  190 39 

Haben Sie versucht -

Select assetid, ts, nodeid, status, value 
From 
logs 
Join sense X on X.status = logs.status 
Group by assetid 
Order by ts DESC 

Aber dies nur Ausgänge 1 Zeile (statt 5)

assetid   ts  nodeid status value 

1 2017-10-26 14:00:10 73  240 58 

Entfernen

Join sense X on X.status = logs.status 

natürlich gibt alle Datensätze, aber das ist nicht benötigt.

Gedanken geschätzt.

Grüße

Aktive

+0

Wenn eine der Antworten unten Ihr Problem gelöst hat, dann markieren Sie es als Antwort und können es uupvote. Wenn nicht, dann nenne bitte das verbleibende Problem unter den nützlichen Antworten. –

Antwort

1

Tatsächlich gibt Ihre Abfrage 5 Zeilen zurück, 1 für jede ID. Aber es werden keine Zeilen mit den neuesten ts für jede ID zurückgegeben. Sie können dies überprüfen, indem Sie auf den Link für eine Demo klicken. Sie können die Ergebnisse beider Abfragen vergleichen.

Um diese Aufgabe zu erreichen, Abfrage folgenden wird Ihnen helfen:

Select l.assetid, l.ts, logs.nodeid, X.status, X.value 
From 
logs 
inner Join sense X on X.status = logs.status 
inner join (select assetid, max(ts) as ts from logs group by assetid) l 
on l.assetid = logs.assetid and logs.ts = l.ts 
Group by l.assetid 
Order by l.ts DESC; 

Click here for Demo

EDIT:

Wenn dataype von ts wird Zeichenfolge dann ersetzen max(ts) in obiger Abfrage mit:

max(str_to_date(ts,'%d%m%y')) 

Fühlen Sie sich frei, irgendwelche Zweifel zu stellen.

Hoffe es hilft!

+0

Danke Harshil aber gibt nur 1 Zeile (die gleiche Zeile wie mein Versuch) zurück – Active

+0

Laufen Sie diese Abfrage Stand-Alone oder ist das ein Teil einer anderen Abfrage? Sie können die Demo überprüfen. Es gibt eindeutig alle erforderlichen Zeilen zurück. –

+0

Benutzt du 'limit 1' irgendwo in deiner Anfrage? –

0

Verwenden GROUP BY Kleinstwert für jede AssetID zu finden und dann JOIN mit dem logs und sense

Select * 
FROM logs l 
JOIN sense s ON s.status = l.status 
JOIN 
(
    Select assetid, max(ts) maxts 
    From logs 
    Group by assetid 
) t ON t.assetid = l.assetid and l.ts = t.maxts 

demo

+0

Danke Radim Baca aber gibt keine Zeilen zurück – Active

+0

@Active und die Unterabfrage tut? –

+0

Keine Zeilen, möglicherweise ein Problem mit MySQL und Mints – Active

0

Versuchen Sie, diese

Select a1.assetid, MAX(a1.ts), a1.nodeid, a1.status, X.value 
From 
logs a1 
inner join sense X on X.status = a1.status 
Group by assetid, a1.nodeid, a1.status, X.value 
Order by ts DESC 
+0

Danke Stoßwelle. aber gibt nur 1 Zeile (die gleiche Zeile wie mein Versuch) zurück – Active

0

Auf MY SQL 8.0.2

WITH CTE as 
(
Select A.assetid, A.ts, A.nodeid, A.status, B.value, row_number() over(PARTITION BY A.assetid ORDER BY A.ts DESC) AS rn 
from logs as A 
inner join sense B ON A.status=B.status 
) 

SELECT * 
FROM CTE 
WHERE rn='1'; 
Verwandte Themen