SQL Server 2008 utilizzando la SOMMA() OVER(ORDER BY…)

Sto cercando di utilizzare un CTE e CROSS JOIN set di risultati. Vorrei riassumere le 4 righe che porta fino alla riga corrente. L’esempio online ho trovato non utilizzare una CTE, solo una tabella appena creata (http://sqlandme.com/2011/08/17/sql-server-denali-over-rows-range/). La sintassi dovrebbe funzionare, ma mi da un errore dicendo “sintassi non corretta in prossimità di ‘RIGHE'”.

Un Esempio di output dovrebbe essere questo utilizzando la seguente istruzione:
SUM(y) OVER(ORDER BY x 4 RIGHE PRECEDENTI) somma

X Y SOMMA


     1          7     0     No prev rows, so sum is 0
     2          1     7     Sum   = 7 
     3          2     8           = 1 + 7
     4          5     10          = 2 + 1 + 7
     5          7     15          = 5 + 2 + 1 + 7
     6         34     15          = 7 + 5 + 2 + 1
     7         32     48          = 34 + 7 + 5 + 2

Qualcuno ha qualche suggerimento su che cosa è errato con la query? Grazie in anticipo.

with quarterResults as (
      <subquery in here>
)

--COLUMN1: String
--COLUMN2: Date
--COLUMN3: Date
--COLUMN4: Double
select a.TIC, a.DATADATE, a.EFFDATE, SUM(b.valuei) OVER (ORDER BY a.TIC, a.DATADATE, a.EFFDATE ROWS 4 PRECEDING) AS [SUM]
from quarterResults a
cross join quarterResults b
where a.datadate > b.datadate
group by a.tic, a.datadate, a.EFFDATE, a.valuei
order by a.TIC, a.datadate
  • Il primo problema è che PRECEDING è per SQL Server Denali e non SQL Server 2008.
InformationsquelleAutor KKlucznik | 2011-10-04

 

2 Replies
  1. 2

    La documentazione che hai trovato per RIGHE/non è per SQL Server 2008 – è per una versione futura di SQL Server.

    Per eseguire la query in SQL 2008, un approccio potrebbe essere simile a:

    SELECT a.TIC, a.datadate, a.effdate, x.s
    FROM quarterResults a
        CROSS APPLY (   SELECT ISNULL(SUM(v), 0)
                        FROM (  SELECT TOP(4) b.valuei
                                FROM quarterResults b
                                WHERE b.datadate < a.datadate
                                ORDER BY b.datadate DESC ) x(v)
                    ) x(s)
    ORDER BY a.TIC, a.datadate

    Di notare che questa è potenzialmente una query costosa. L’uso dell’espressione con RIGHE probabilmente sarebbe più efficiente, ma, di nuovo, non è disponibile in SQL Server 2008.

    • Michele Petito Ringrazio molto per l’informazione e l’alterazione della query. Non ho capito che si trattava di una versione futura esempio. Modifica ha funzionato come mi aspettavo. So che questo ha il potenziale di essere costoso, ma ulteriori test su più set di dati potrà dire se è accettabile per l’utente.
  2. 0

    Si tagged SQL Server 2008.

    La sintassi non è pronto fino alla prossima versione di SQL Server 2012 aka Denali

    • Grazie per l’aggiornamento. Come di seguito, non sapevo che questa era una versione futura esempio.

Lascia un commento