sql >> Database >  >> RDS >> Mysql

Hoe Group By en self-join te gebruiken om de ingestelde minimum, max, open en sluit dagelijkse prijs te retourneren?

Dus je wilt:

  • De alias C om overeen te komen met alle rijen in de groep voor een bepaalde dag, zodat u MAX() . kunt gebruiken en MIN() over de rijen in die groep.
  • De alias C2 om overeen te komen met de laatste rij op een bepaalde dag.
  • De alias C3 om overeen te komen met een rij later dan C2 op dezelfde dag. Als er geen wordt gevonden, d.w.z. C3.* is NULL, dan C2 is de laatste op die dag.

Dit wordt vaak aangeduid als een greatest-n-per-group query, en het komt vaak voor op Stack Overflow. Hier is een oplossing die ik heb getest voor uw testgegevens, maar u kunt de tag volgen die ik aan uw vraag heb toegevoegd voor andere oplossingen en discussies.

bewerken: Ik miste de vereiste voor zowel de openingsprijs als de slotprijs. Het volgende is bewerkt.

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. Tabel dupliceren in MYSQL zonder één rij tegelijk te kopiëren

  2. MySQL-databasefout:constante, willekeurige of tijdzoneafhankelijke expressies in de (sub)partitioneringsfunctie zijn niet toegestaan

  3. Hoe update ik de MySQL-rij in PHP?

  4. PHP Form stuurt lege gegevens naar mySQL