Próbuję migrować zapytanie z Oracle do SQL Server 2014.
Oto moje zapytanie, które działa świetnie w Oracle:
select
count(distinct A) over (partition by B) / count(*) over() as A_B
from MyTable
Oto błąd, który wystąpił po próbie uruchomienia tego zapytania w programie SQL Server 2014.
Use of DISTINCT is not allowed with the OVER clause
Czy ktoś wie na czym polega problem? Czy takie zapytanie jest możliwe w SQL Server? Proszę doradź.
MyTable
? A może wystarczą odrębne wiersze? I nie musisz brać pod uwagę podziału przez błąd zero, jeśli nie ma żadnych wierszyMyTable
?Odpowiedzi:
Nie, to nie jest obecnie zaimplementowane. Zobacz następujące żądanie elementu połączenia.
Żądanie rozszerzenia klauzuli OVER - klauzula DISTINCT dla funkcji agregujących
Innym możliwym wariantem byłoby
cast to
NUMERIC
jest, aby uniknąć podziału na liczby całkowite. Powód klauzuli dołączania jest wyjaśniony tutaj .W razie potrzeby można go zastąpić
ON M.B = T.B OR (M.B IS NULL AND T.B IS NULL)
(lub po prostu,ON M.B = T.B
jeśliB
kolumna nie ma wartości zerowej).źródło
Daje to odrębną liczbę (*) dla A podzielonego przez B:
źródło
A
nie ma wartości zerowej (jak myślę, że liczy się również null).abs(dense_rank - dense_rank) + 1
, wierzę.Możesz przyjąć maksymalną wartość,
dense_rank()
aby uzyskać odrębną liczbę A podzieloną przez B.Aby zająć się przypadkiem, w którym A może mieć wartości zerowe, możesz użyć,
first_value
aby dowiedzieć się, czy w partycji występuje wartość zerowa, a następnie odjąć 1, jeśli jest to sugerowane przez Martina Smitha w komentarzu.źródło
Spróbuj wykonać podkwerendę, pogrupując według A, B i uwzględniając liczbę. Następnie w zewnętrznym zapytaniu liczba (odrębna) staje się liczbą regularną, a liczba (*) staje się sumą (cnt).
źródło