首页 > 解决方案 > 在子查询中聚合按位或*分区*?

问题描述

我一直在研究如何在子查询中的 TSQL 中进行按位或聚合,并且在一个热门问题中给出的答案似乎并没有维护分区。有什么办法让我分区吗?

假设我们有以下数据:

id | someCount | someFlags
1  | 2         | 0
1  | 3         | 2
1  | 0         | 1
2  | 1         | 4
2  | 5         | 0
2  | 1         | 1

我可以在不丢失任何原始行的情况下获得分区SUM的字段,如下所示:someCountid

SELECT [testSum] = SUM([someCount]) OVER (PARTITION BY [id]) FROM myTable

有没有办法通过按位或运算来做到这一点?所以我会得到:

id | value
1  | 3
1  | 3
1  | 3
2  | 5
2  | 5
2  | 5

标签: sql-servertsqlaggregationsql-server-2019

解决方案


一种方法如下。将其扩展到您关心的位数。

不得不重复这PARTITION BY [id]有点乏味,但我希望 SQL Server 只做一次分区工作并计算MAX 同一个聚合运算符中的所有表达式。

SELECT *, 
        MAX(someFlags & 1) OVER (PARTITION BY [id])  +
        MAX(someFlags & 2) OVER (PARTITION BY [id])  +
        MAX(someFlags & 4) OVER (PARTITION BY [id])  +
        MAX(someFlags & 8) OVER (PARTITION BY [id])
FROM (VALUES
(1 , 2 , 0),
(1 , 3 , 2),
(1 , 0 , 1),
(2 , 1 , 4),
(2 , 5 , 0),
(2 , 1 , 1)
)V(id ,someCount ,someFlags)

推荐阅读