sql >> Database teknologi >  >> RDS >> Mysql

Hvordan bruger man Group By og selvtilmelder sig for at returnere min, max, åbning og luk dagligt prisresultatsæt?

Så du vil have:

  • Aliaset C for at svare til alle rækker i gruppen for en given dag, så du kan bruge MAX() og MIN() over rækkerne i den gruppe.
  • Aliaset C2 for at svare til den sidste række på en given dag.
  • Aliaset C3 at svare til en række senere end C2 samme dag. Hvis ingen findes, dvs. C3.* er NULL, derefter C2 er den seneste på den dag.

Dette er ofte mærket som en greatest-n-per-group forespørgsel, og den kommer ofte op på Stack Overflow. Her er en løsning, som jeg testede for dine testdata, men du kan følge tagget, jeg tilføjede til dit spørgsmål, for andre løsninger og diskussion.

rediger: Jeg savnede kravet til både åbningskurs og lukkekurs. Følgende er redigeret.

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. Hvordan kan jeg konvertere MySQL-database til SQLite i PHP?

  2. Opret en SSH-tunnel til MySQL-fjernadgang

  3. Få rodstien til et træ med ren MySQL

  4. ZF2 validerer dato- og tidsformat PT_BR altid Indtastningen ser ikke ud til at være en gyldig dato