patternsqlModerate
Using DISTINCT in window function with OVER
Viewed 0 times
distinctwithfunctionusingwindowover
Problem
I'm trying to migrate a query from Oracle to SQL Server 2014.
Here is my query which works great in Oracle:
Here is the error i got after tried to run this query in SQL Server 2014.
Anyone know what is the problem? Is such as kind of query possible in SQL Server?
Please advise.
Here is my query which works great in Oracle:
select
count(distinct A) over (partition by B) / count(*) over() as A_B
from MyTableHere is the error i got after tried to run this query in SQL Server 2014.
Use of DISTINCT is not allowed with the OVER clauseAnyone know what is the problem? Is such as kind of query possible in SQL Server?
Please advise.
Solution
Anyone know what is the problem? Is such as kind of query possible in
SQL Server?
No it isn't currently implemented. See the following connect item request.
OVER clause enhancement request - DISTINCT clause for aggregate functions
Another possible variant would be
the cast to
It can be replaced with
SQL Server?
No it isn't currently implemented. See the following connect item request.
OVER clause enhancement request - DISTINCT clause for aggregate functions
Another possible variant would be
SELECT M.A,
M.B,
T.A_B
FROM MyTable M
JOIN (SELECT CAST(COUNT(DISTINCT A) AS NUMERIC(18,8)) / SUM(COUNT(*)) OVER() AS A_B,
B
FROM MyTable
GROUP BY B) T
ON EXISTS (SELECT M.B INTERSECT SELECT T.B)the cast to
NUMERIC is there to avoid integer division. The reason for the join clause is explained here.It can be replaced with
ON M.B = T.B OR (M.B IS NULL AND T.B IS NULL) if preferred (or simply ON M.B = T.B if the B column is not nullable).Code Snippets
SELECT M.A,
M.B,
T.A_B
FROM MyTable M
JOIN (SELECT CAST(COUNT(DISTINCT A) AS NUMERIC(18,8)) / SUM(COUNT(*)) OVER() AS A_B,
B
FROM MyTable
GROUP BY B) T
ON EXISTS (SELECT M.B INTERSECT SELECT T.B)Context
StackExchange Database Administrators Q#89031, answer score: 14
Revisions (0)
No revisions yet.