Sql-Server

SQL 在分區上計數不同

  • June 17, 2019

我有一個包含兩列的表,我想計算 Col_B 上的不同值(以 Col_A 為條件)。

我的表

Col_A | Col_B 
A     | 1
A     | 1
A     | 2
A     | 2
A     | 2
A     | 3
b     | 4
b     | 4
b     | 5

預期結果

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     | 2

我嘗試了以下程式碼

select *, 
count (distinct col_B) over (partition by col_A) as 'Result'
from MyTable

計數(不同的 col_B)不起作用。如何重寫 count 函式來計算不同的值?

這就是我的做法:

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;

鑑於問題中提供的數據,該GROUP BY子句是多餘的,但可能會為您提供更好的執行計劃。見後續問答CROSS APPLY 產生外連接

如果您希望將該功能添加到 SQL Server,請考慮投票支持回饋站點上的聚合函式的 OVER 子句增強請求 - DISTINCT 子句。

引用自:https://dba.stackexchange.com/questions/239788