Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да се самосъединя таблица по начин, по който всеки запис да се съедини с предишния?

Единият вариант е да използвате рекурсивен cte (ако правилно разбирам изискванията ви):

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

Демонстрация на SQL Fiddle

Ако имате нужда от текуща обща сума за всеки символ, която да използвате като процентна промяна, тогава е достатъчно лесно да добавите допълнителна колона за тази сума - не бяхте напълно сигурни какви са вашите намерения, така че горното просто разделя текущата затворена сума на предишна затворена сума.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете SQL Trace за заснемане на събития на SQL Server

  2. Грешка в заявката с двусмислено име на колона в SQL

  3. Форматирайте SQL в SQL Server Management Studio

  4. Сравнете стойностите на две колони, след което изберете по-голямата стойност

  5. Намиране на дубликати в една колона с помощта на select where в SQL Server 2008