Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak samodzielnie dołączyć do tabeli w taki sposób, aby każdy rekord był połączony z poprzednim rekordem?

Jedną z opcji jest użycie rekurencyjnego cte (jeśli dobrze rozumiem Twoje wymagania):

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

Pokaz SQL Fiddle

Jeśli potrzebujesz sumy bieżącej dla każdego symbolu do użycia jako zmiana procentowa, łatwo dodać dodatkową kolumnę dla tej kwoty -- nie byłem do końca pewien, jakie były twoje intencje, więc powyższe po prostu dzieli bieżącą zamkniętą kwotę przez poprzednia zamknięta kwota.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest domyślny poziom izolacji transakcji dla programu SQL Server z ADO.NET?

  2. Różnica między wielowyrazowymi funkcjami z wartościami tabelarycznymi a wbudowanymi funkcjami z wartościami tabelarycznymi w programie SQL Server

  3. Jak uzyskać wartości, które nie zawierają liczb w SQL Server?

  4. SqlBulkCopy z listy<>

  5. Jak sp_describe_first_result_set działa w programie SQL Server