patternsqlMajor
SQL counting distinct over partition
Viewed 0 times
distinctpartitioncountingsqlover
Problem
I have a table with two columns, I want to count the distinct values on Col_B over (conditioned by) Col_A.
MyTable
Expected Result
I tried the following code
count (distinct col_B) is not working.
How can I rewrite the count function to count distinct values?
MyTable
Col_A | Col_B
A | 1
A | 1
A | 2
A | 2
A | 2
A | 3
b | 4
b | 4
b | 5Expected Result
Col_A | Col_B | Result
A | 1 | 3
A | 1 | 3
A | 2 | 3
A | 2 | 3
A | 2 | 3
A | 3 | 3
b | 4 | 2
b | 4 | 2
b | 5 | 2I tried the following code
select *,
count (distinct col_B) over (partition by col_A) as 'Result'
from MyTablecount (distinct col_B) is not working.
How can I rewrite the count function to count distinct values?
Solution
This is how I'd do it:
The
Consider voting for OVER clause enhancement request - DISTINCT clause for aggregate functions on the feedback site if you would like that feature added to SQL Server.
SELECT *
FROM #MyTable AS mt
CROSS APPLY ( SELECT COUNT(DISTINCT mt2.Col_B) AS dc
FROM #MyTable AS mt2
WHERE mt2.Col_A = mt.Col_A
-- GROUP BY mt2.Col_A
) AS ca;The
GROUP BY clause is redundant given the data provided in the question, but may give you a better execution plan. See the follow-up Q & A CROSS APPLY produces outer join.Consider voting for OVER clause enhancement request - DISTINCT clause for aggregate functions on the feedback site if you would like that feature added to SQL Server.
Code Snippets
SELECT *
FROM #MyTable AS mt
CROSS APPLY ( SELECT COUNT(DISTINCT mt2.Col_B) AS dc
FROM #MyTable AS mt2
WHERE mt2.Col_A = mt.Col_A
-- GROUP BY mt2.Col_A
) AS ca;Context
StackExchange Database Administrators Q#239788, answer score: 22
Revisions (0)
No revisions yet.