Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie verwende ich „Gruppieren nach“ und „Self Join“, um den Mindest-, Höchst-, Eröffnungs- und Schlusskurs des Tagesergebnisses zurückzugeben?

Sie wollen also:

  • Der Alias ​​C um allen Zeilen in der Gruppe für einen bestimmten Tag zu entsprechen, also können Sie MAX() verwenden und MIN() über die Zeilen in dieser Gruppe.
  • Der Alias ​​C2 um der letzten Zeile an einem bestimmten Tag zu entsprechen.
  • Der Alias ​​C3 um einer Zeile später als C2 zu entsprechen am selben Tag. Wenn keine gefunden wird, also C3.* NULL ist, dann C2 ist die neueste an diesem Tag.

Dies wird oft als greatest-n-per-group bezeichnet Abfrage, und es taucht häufig bei Stack Overflow auf. Hier ist eine Lösung, die ich für Ihre Testdaten getestet habe, aber Sie können dem Tag folgen, das ich Ihrer Frage hinzugefügt habe, um andere Lösungen und Diskussionen zu erhalten.

Bearbeiten: Ich habe die Anforderung sowohl für den Eröffnungspreis als auch für den Schlusspreis verpasst. Folgendes wird bearbeitet.

SELECT DATE_FORMAT(C.`DTE`, '%m/%d/%Y') AS trading_day, 
  MIN(C.`PRICE`) AS min_price, 
  MAX(C.`PRICE`) AS max_price, 
  Copen.`PRICE` AS opening_price,
  Cclose.`PRICE` AS closing_price 
FROM `CHART_DATA` AS C 
INNER JOIN `CHART_DATA` AS Cclose 
  ON DAY(C.`DTE`) = DAY(Cclose.`DTE`) 
LEFT OUTER JOIN `CHART_DATA` AS Cclose_later 
  ON DAY(C.`DTE`) = DAY(Cclose_later.`DTE`) AND Cclose.`DTE` < Cclose_later.`DTE`
INNER JOIN `CHART_DATA` AS Copen 
  ON DAY(C.`DTE`) = DAY(Copen.`DTE`) 
LEFT OUTER JOIN `CHART_DATA` AS Copen_earlier 
  ON DAY(C.`DTE`) = DAY(Copen_earlier.`DTE`) AND Copen.`DTE` < Copen_earlier.`DTE`
WHERE Cclose_later.`DTE` IS NULL AND Copen_earlier .`DTE` IS NULL 
GROUP BY trading_day;