Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment auto-joindre une table de manière à ce que chaque enregistrement soit joint à l'enregistrement précédent ?

Une option consiste à utiliser un cte récursif (si je comprends bien vos besoins) :

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

Démo SQL Fiddle

Si vous avez besoin d'un total cumulé pour chaque symbole à utiliser comme changement de pourcentage, alors assez facile d'ajouter une colonne supplémentaire pour ce montant - n'était pas complètement sûr de vos intentions, donc ce qui précède divise simplement le montant fermé actuel par le montant fermé précédent.