PreambułaBadałem koncepcję, a to, o czym piszę poniżej, jest skróconą wersją tego, co próbowałem. Jeśli spojrzysz na to i pomyślisz "To nie ma sensu robić tego w ten sposób", to prawdopodobnie dlatego, że nie mam żadnego sensu - mogą istnieć skuteczniejsze sposoby robienia tego. Po prostu chciałem to wypróbować, ponieważ wygląda interesująco.SQL ORDER BY w klauzuli OVER niekompatybilny z agregacją CLR?
Co próbuję zrobić, aby obliczyć dowolne obliczenia przy użyciu niestandardowych agregacji CLR w SQL za pomocą odwrotnej polską implementacją. Używam danych:
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
Wynik obliczeń powinien wynosić 123 (= (100 * 1) + (10 * 2) + (1 * 3))
.
Korzystanie następujące SQL (i funkcji CLR ReversePolishAggregate
i ToReversePolishArguments
* że pisałem) mogę uzyskać poprawny wynik:
SELECT K
, dbo.ReversePolishAggregate(dbo.ToReversePolishArguments(Instruction, Amt))
FROM dbo.ReversePolishCalculation
GROUP BY K;
Problem chcę uogólniać rozwiązanie bardziej umieszczając instrukcje i kolejność w osobnej tabeli, dzięki czemu mogę tworzyć obliczenia na arbitralnych danych. Na przykład, myślałem o stół tak:
Item | Type | Amount
-----+----------+-------
A | Budgeted | 10
A | Actual | 12
B | Actual | 20
B | Budgeted | 18
i łączenia go z tabeli obliczeniowej jak ten
Type | Instruction | Order
---------+-------------+------
Budgeted | Push | 1
Actual | Minus | 2
do obliczane czy każda pozycja jest nad lub pod budżetu. Ważną kwestią jest to, że minus nie jest przemienny, więc muszę określić kolejność, aby upewnić się, że rzeczywista kwota jest odejmowana od kwoty budżetowej, a nie odwrotnie. Spodziewałem się, że będę w stanie to zrobić z klauzulą ORDER BY
wewnątrz klauzuli OVER
agregacji (a następnie trochę poprawić ten wynik).
SELECT K
, dbo.[ReversePolishAggregate](
dbo.[ToReversePolishArguments](Instruction, Amt))
OVER (PARTITION BY K ORDER by [Order])
FROM dbo.ReversePolishCalculation;
Jednakże pojawia się błąd:
Incorrect syntax near the keyword 'ORDER'.
Sprawdziłem składnię, uruchamiając następującą instrukcję SQL
SELECT K
, SUM(Amt) OVER (PARTITION BY K ORDER BY [Order])
FROM dbo.ReversePolishCalculation;
To działa prawidłowo (analizuje i działa, chociaż ja” m nie jestem pewien, czy wynik jest znaczący), więc pozostaję przy założeniu, że jest to problem z niestandardowymi agregacjami lub funkcjami CLR.
Moje pytania Czy to ma działać? Czy jest jakaś dokumentacja mówiąca wyraźnie, że nie jest to obsługiwane? Czy mam prawidłową składnię?
Używam Visual Studio 2012 Premium, SQL Server Management Studio 2012 i .NET Framework 4.0.
* Stworzyłem 2 funkcje CLR jako obejście, aby nie przekazywać wielu argumentów do jednej funkcji agregacji - patrz this article.
EDIT: This post wygląda na to, że nie jest obsługiwany, ale miałem nadzieję na coś bardziej oficjalnego.
na stanowisku ty związane, wydaje się być „oficjalny” update na dole: „Zgłoszenie fro m mój element połączenia (to było szybkie ...) jest to, że okienkowanie SQLCLR UDA "nie dokonało cięcia w Denali. Może następnym razem "." – mellamokb
Zobacz tę odpowiedź na stronie: http://stackoverflow.com/questions/22352026/is-it-possible-to-use-user-defined-aggregates-clr-with-window-functions- over - Wygląda na to, że możesz użyć opcji OVER, ale może NIE ZAMÓWIĆ by ... –
Czy możesz obejść to, zastępując wszystkie Minusy mnożeniem przez -1 i dodaje? –