sql >> Databáze >  >> RDS >> Mysql

Jak používat Group By a self-join k vrácení minimální, maximální, otevřené a uzavřené denní výsledné ceny?

Takže chcete:

  • Alias ​​C aby odpovídaly všem řádkům ve skupině pro daný den, takže můžete použít MAX() a MIN() nad řádky v této skupině.
  • Alias ​​C2 aby odpovídaly poslednímu řádku v daný den.
  • Alias ​​C3 aby odpovídala řádku pozdějšímu než C2 ten samý den. Pokud není nalezen žádný, tj. C3.* je NULL, pak C2 je nejpozději v daný den.

Toto je často označováno jako greatest-n-per-group dotazu a často se objevuje na Stack Overflow. Zde je řešení, které jsem testoval pro vaše testovací data, ale můžete sledovat značku, kterou jsem přidal k vaší otázce, kde najdete další řešení a diskusi.

upravit: Chyběl mi požadavek na otevírací i zavírací cenu. Následující text je upraven.

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. Rozdělení řetězce do více řádků v Oracle

  2. SQL Challenge/Puzzle:Jak sloučit vnořené rozsahy?

  3. Název schématu MySQL s pomlčkou mi neumožňuje provést dotaz z příkazového řádku

  4. Jak vytvořit databázi zásob v aplikaci Microsoft Access