2014-06-11 14 views
5

Ho indagato su un concetto e quello che sto postando è una versione ridotta di ciò che ho provato. Se la guardi e pensi "Non ha senso farlo in quel modo", probabilmente è perché non ha alcun senso - potrebbero esserci modi più efficaci per farlo. Volevo solo provare questo perché sembra interessante.SQL ORDER BY all'interno della clausola OVER incompatibile con l'aggregazione CLR?

Che cosa sto tentando di eseguire per calcolare calcoli arbitrari utilizzando le aggregazioni personalizzate CLR in SQL utilizzando un'implementazione simile a quella di Reverse-Polish. Sto utilizzando i dati:

K | Amt | Instruction | Order 
--+-----+-------------+------ 
A | 100 |  Push |  1 
A | 1 | Multiply |  2 
A | 10 |  Push |  3 
A | 2 | Multiply |  4 
A |  |   Add |  5 
A | 1 |  Push |  6 
A | 3 | Multiply |  7 
A |  |   Add |  8 

Il risultato del calcolo dovrebbe essere 123 (= (100 * 1) + (10 * 2) + (1 * 3)).

Utilizzando il seguente SQL (e le funzioni CLR ReversePolishAggregate e ToReversePolishArguments * che ho scritto) posso ottenere il risultato corretto:

SELECT K 
    , dbo.ReversePolishAggregate(dbo.ToReversePolishArguments(Instruction, Amt)) 
FROM dbo.ReversePolishCalculation 
GROUP BY K; 

Il problema voglio generalizzare la soluzione più mettendo le istruzioni e l'ordine in una tabella separata in modo che possa creare calcoli su dati arbitrari. Per esempio, stavo pensando di una tabella come questa:

Item |  Type | Amount 
-----+----------+------- 
    A | Budgeted |  10 
    A | Actual |  12 
    B | Actual |  20 
    B | Budgeted |  18 

e unirsi a una tabella di calcolo come questo

Type | Instruction | Order 
---------+-------------+------ 
Budgeted |  Push |  1 
    Actual |  Minus |  2 

per calcolare se ogni articolo è sopra o sotto di bilancio. L'importante considerazione è che il segno meno è non commutativo, quindi devo specificare l'ordine per garantire che l'importo effettivo venga sottratto dall'importo preventivato, e non viceversa. Mi aspettavo che sarei stato in grado di farlo con la clausola ORDER BY all'interno della clausola OVER dell'aggregazione (e quindi un po 'più di tweaking del risultato).

SELECT K 
    , dbo.[ReversePolishAggregate](
    dbo.[ToReversePolishArguments](Instruction, Amt)) 
    OVER (PARTITION BY K ORDER by [Order]) 
FROM dbo.ReversePolishCalculation; 

Tuttavia ottengo l'errore:

Incorrect syntax near the keyword 'ORDER'.

Ho controllato la sintassi eseguendo la seguente istruzione SQL

SELECT K 
    , SUM(Amt) OVER (PARTITION BY K ORDER BY [Order]) 
FROM dbo.ReversePolishCalculation; 

Questo funziona bene (analizza e corre, anche se io' Non sono sicuro che il risultato sia significativo), quindi mi viene lasciato supporre che si tratti di un problema con aggregazioni o funzioni CLR personalizzate.

Le mie domande È supposto che funzioni? C'è qualche documentazione che dice esplicitamente che questo non è supportato? Ho la sintassi giusta?

Utilizzo Visual Studio 2012 Premium, SQL Server Management Studio 2012 e .NET framework 4.0.

* Ho creato 2 funzioni CLR come soluzione per non essere in grado di passare più argomenti in una singola funzione di aggregazione - vedere this article.

EDIT: This post sembra che non sia supportato, ma speravo in qualcosa di un po 'più ufficiale.

+0

Sul posto si è collegato, sembra che ci sia un aggiornamento "ufficiale" in basso: "feedback fro Il mio elemento di connessione (che è stato veloce ...) è che la finestra sugli UDA SQLCLR "non ha fatto il taglio in Denali. Forse la prossima volta '. ". – mellamokb

+1

Vedere questa risposta su SO: http://stackoverflow.com/questions/22352026/is-it-possible-to-use-user-defined-aggregates-clr-with-window-functions- over - Quindi sembra che tu possa usare OVER, ma forse non ORDINA da .... –

+0

Potresti aggirare questo sostituendo tutti i Minuses con moltiplicazione per -1 e aggiunge? –

risposta