2017-10-27 1 views
-1

Ich bin nicht stark in DB und ich brauche deine Hilfe. Ich brauche SQL-Anfrage mit GROUP um zweimal.SELECT Gruppe von zweimal

Beispiel meiner Daten in Tabelle

<table border="1" style="border-collapse:collapse"> 
 
<tr><th>id</th><th>market_id</th><th>price</th><th>low</th><th>high</th><th>symbol</th><th>created_at</th></tr> 
 
<tr><td>1</td><td>1</td><td>5773.8</td><td>5685</td><td>6020</td><td>btcusd</td><td>2017-10-27 16:46:10</td></tr> 
 
<tr><td>2</td><td>1</td><td>0.4274</td><td>0.39</td><td>0.43983</td><td>iotusd</td><td>2017-10-27 16:46:11</td></tr> 
 
<tr><td>3</td><td>1</td><td>0.20026</td><td>0.1986</td><td>0.20352</td><td>xrpusd</td><td>2017-10-27 16:46:12</td></tr> 
 
<tr><td>4</td><td>2</td><td>5771</td><td>5685</td><td>6020</td><td>btcusd</td><td>2017-10-27 16:46:18</td></tr> 
 
<tr><td>5</td><td>2</td><td>0.4274</td><td>0.39</td><td>0.43983</td><td>iotusd</td><td>2017-10-27 16:46:18</td></tr> 
 
<tr><td>6</td><td>2</td><td>0.20026</td><td>0.1986</td><td>0.20352</td><td>xrpusd</td><td>2017-10-27 16:46:19</td></tr> 
 
<tr><td>7</td><td>1</td><td>5773.1</td><td>5685</td><td>6020</td><td>btcusd</td><td>2017-10-27 16:46:25</td></tr> 
 
<tr><td>8</td><td>1</td><td>0.4274</td><td>0.39</td><td>0.43983</td><td>iotusd</td><td>2017-10-27 16:46:25</td></tr> 
 
<tr><td>9</td><td>1</td><td>0.20026</td><td>0.1986</td><td>0.20352</td><td>xrpusd</td><td>2017-10-27 16:46:26</td></tr> 
 
<tr><td>10</td><td>2</td><td>5773.1</td><td>5685</td><td>6020</td><td>btcusd</td><td>2017-10-27 16:46:32</td></tr> 
 
<tr><td>11</td><td>2</td><td>0.42741</td><td>0.39</td><td>0.43983</td><td>iotusd</td><td>2017-10-27 16:46:32</td></tr> 
 
<tr><td>12</td><td>2</td><td>0.20026</td><td>0.1986</td><td>0.20352</td><td>xrpusd</td><td>2017-10-27 16:46:33</td></tr></table>

Ich mag würde neueste Daten für jedes market_id und Symbol bekommen das bedeutet, das ich brauche, wie dass am Ende somethind:

- id market_id symbol 
- 7 1  btcusd 
- 8 1  iotusd 
- 9 1  xrpusd 
- 10 2  btcusd 
- 11 2  iotusd 
- 12 2  xrpusd 

Wirklich Hilfe, ein bisschen blockiert.

+0

Generieren Sie eine abgeleitete Tabelle zu erhalten, die max erstellt, market_Id und Symbol gruppiert nach market_ID und Symbol, dann kommen Sie INNER, dass auf Ihre Basis zurück legen Sie die anderen benötigten Daten zurückzukehren. – xQbert

+0

Was hast du bisher versucht? – kchason

Antwort

1

Sie sind fast da. Versuchen Sie, diese

SELECT c.* 
FROM CRYPTO as C 
JOIN (
    SELECT market_id, symbol, MAX(id) as maxid 
    FROM CRYPTO 
    GROUP BY market_id, symbol 
) AS C2 
ON C2.maxid = C.id and C.market_id = c2.market_id and c.symbol = c2.symbol 
+0

Thx Radim, yep ... Ich war in der Nähe :) –

+0

Dies könnte falsche Ergebnisse zurückgeben, wenn ID ist eine automatische Nummer und erstellte Daten/Datensätze werden nicht immer in der Reihenfolge eingefügt. wenn sie sind, dann wäre das in Ordnung. – xQbert

+0

Ja, ich habe Sequenz hinzugefügt. Also sollte es funktionieren. Aber gute Note –

0

habe ich versucht, diese Anfragen

SELECT * FROM CRYPTO as C3 
    JOIN (
    SELECT MAX(id) as max 
    FROM CRYPTO as C1 
    GROUP BY symbol 
    ) AS C2 
ON C2.max = C3.id 

SELECT M.id, M.name, R.symbol FROM MARKET AS M 
    JOIN (
    SELECT DISTINCT C.symbol, C.market_id 
    FROM CRYPTO as C 
    ) as R 
ON M.id = R.market_id 

Aber schließlich habe ich nicht die gute Kombination zu finden.

+0

Ihre erste Abfrage muss nur 'nach Symbol gruppieren, market_ID', um die gewünschten Ergebnisse zu erhalten vorausgesetzt ID ist autonumber und Datensätze werden in der Reihenfolge von created_at eingegeben – xQbert

1

Entlang dieser Linien ...

SELECT MAX(id), market_id, symbol 
    FROM crypto 
    GROUP BY market_id, symbol 
+0

Ah nein, ich brauche max (id), einzigartig (Markt), einzigartig (Symbol) –

+0

Wird dies nicht erreicht? Die GROUP BY-Klausel reduziert die Werte in eindeutige Zeilen. (Ich habe die Felder entsprechend bearbeitet) – LegendaryJLD

+0

Dies liefert die angegebenen Beispielergebnisse zurück. Aber ich denke, die Frage ist unvollständig/mehrdeutig. Es zeigt nicht, wie "die neuesten Daten für jede Markt-ID und jedes Symbol erhalten werden". Ich habe die Daten so interpretiert, dass sie den Preis enthalten, niedrig hoch. und das "Something like" ist ein unvollständiges Beispiel für die Ergebnisse. – xQbert

1

Hier ist mein Kommentar als SQL angegeben.

SELECT A.ID, A.MarketID, A.Symbol, A.Price, A.Low, A.High 
FROM CRYPTO A 
INNER JOIN (SELECT max(Created_at) MCA, Market_ID, Symbol 
      FROM crypto 
      GROUP BY Market_ID, Symbol) B 
    on A.Created_At = B.MCA 
and A.market_ID = B.Market_ID 
and A.Symbol = B.Symbol 

Was dies bedeutet:

Die abgeleiteten Tabelle (aliased B) erzeugt 1 Zeile für jedes Symbol und market_ID die max created_at Zeit. Er verwendet dann diesen abgeleiteten Tabellensatz, um sich dem Basissatz (Alias ​​A) anzunähern, um die Daten auf diejenigen zu beschränken, die den Maximalwert created_at haben. Dadurch können wir den gesamten Datensatz von A für jede eindeutige market_Id und jedes Symbol anzeigen. aber nur für Datensätze mit dem Maximum created_at.

Mit anderen Engines können Sie ein Kreuz anwenden oder eine Analyse verwenden, um die gewünschten Ergebnisse zu erzielen.

+0

Ja, das ist es. Vielen Dank xQbert –