sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo auto-unirse a la tabla de manera que cada registro se una con el registro anterior?

Una opción es usar un cte recursivo (si entiendo sus requisitos correctamente):

WITH RNCTE AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY date) rn
        FROM quotes
  ),
CTE AS (
  SELECT symbol, date, rn, cast(0 as decimal(10,2)) perc, closed
  FROM RNCTE
  WHERE rn = 1
  UNION ALL
  SELECT r.symbol, r.date, r.rn, cast(c.closed/r.closed as decimal(10,2)) perc, r.closed
  FROM CTE c 
    JOIN RNCTE r on c.symbol = r.symbol AND c.rn+1 = r.rn
  )
SELECT * FROM CTE
ORDER BY symbol, date

Demostración de SQL Fiddle

Si necesita un total acumulado para cada símbolo para usar como cambio porcentual, entonces es bastante fácil agregar una columna adicional para esa cantidad:no estaba completamente seguro de cuáles eran sus intenciones, por lo que lo anterior solo divide la cantidad cerrada actual por el importe cerrado anterior.