sql-server - 在子查询中聚合按位或*分区*?
问题描述
我一直在研究如何在子查询中的 TSQL 中进行按位或聚合,并且在一个热门问题中给出的答案似乎并没有维护分区。有什么办法让我分区吗?
假设我们有以下数据:
id | someCount | someFlags
1 | 2 | 0
1 | 3 | 2
1 | 0 | 1
2 | 1 | 4
2 | 5 | 0
2 | 1 | 1
我可以在不丢失任何原始行的情况下获得分区SUM
的字段,如下所示:someCount
id
SELECT [testSum] = SUM([someCount]) OVER (PARTITION BY [id]) FROM myTable
有没有办法通过按位或运算来做到这一点?所以我会得到:
id | value
1 | 3
1 | 3
1 | 3
2 | 5
2 | 5
2 | 5
解决方案
一种方法如下。将其扩展到您关心的位数。
不得不重复这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)
推荐阅读
- python-3.x - 为什么文本文件中的返回中有框(Python 3x)
- dart - 使用 Navigator.pushNamed 导航时如何发送参数
- mstest - MSTests 在命令行失败,但在 Visual Studio 2017 IDE 中工作
- angular - 在角度应用中自动触发 IE 10/11 的角度材料错误状态匹配器
- handlebars.js - 如何处理 Handlebars 部分中的布尔 HTML 属性?
- c# - 通过 Entity Framework Core 将列表传递给视图
- prestashop-1.7 - Prestashop 1.7.5 模块 - 更新 SQL 自定义表
- c# - XAML 是否支持声明非泛型 IList 集合?
- html - Bootstrap col 不填充 100 宽度
- html - 垂直对齐属性如何工作?