sql >> Databasteknik >  >> RDS >> Mysql

Hur använder man Group By och går med själv för att returnera min, max, öppna och stänga dagliga prisresultat?

Så du vill:

  • Aliaset C för att motsvara alla rader i gruppen för en viss dag, så att du kan använda MAX() och MIN() över raderna i den gruppen.
  • Aliaset C2 för att motsvara den sista raden på en viss dag.
  • Aliaset C3 för att motsvara en rad senare än C2 på samma dag. Om ingen hittas, dvs C3.* är NULL, sedan C2 är den senaste den dagen.

Detta märks ofta som en greatest-n-per-group fråga, och den dyker upp ofta på Stack Overflow. Här är en lösning som jag testade för dina testdata, men du kan följa taggen jag lade till i din fråga för andra lösningar och diskussioner.

redigera: Jag missade kravet på både öppningskurs och stängningskurs. Följande är redigerat.

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;


  1. Lägg till timmar till ett tidsvärde i PostgreSQL

  2. Hantering av latens i MySQL-transaktioner

  3. Finns det någon fördel med att skapa och indexera på en primärnyckel?

  4. Rekursiv fråga i PostgreSQL. VÄLJ *