sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo usar Agrupar por y auto-unirse para devolver el conjunto de resultados de precio diario mínimo, máximo, abierto y cerrado?

Así que quieres:

  • El alias C para corresponder a todas las filas en el grupo para un día determinado, por lo que puede usar MAX() y MIN() sobre las filas de ese grupo.
  • El alias C2 para corresponder a la última fila en un día dado.
  • El alias C3 para corresponder a una fila posterior a C2 En el mismo día. Si no se encuentra ninguno, es decir, C3.* es NULL, entonces C2 es la última de ese día.

Esto a menudo se etiqueta como greatest-n-per-group consulta, y aparece con frecuencia en Stack Overflow. Aquí hay una solución que probé para sus datos de prueba, pero puede seguir la etiqueta que agregué a su pregunta para otras soluciones y discusión.

editar: Me perdí el requisito tanto para el precio de apertura como para el precio de cierre. Lo siguiente está editado.

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;