sql - 在 SQL 窗口函数中列出或连接
问题描述
我团队的一个(对 SQL 相对较新)成员正在编写一个碰巧使用窗口函数的 SQL 查询。在审查后,我注意到他们的窗口功能是这样构建的:
COUNT(*) OVER(PARTITION BY Part1+Part2) AS A
我立即做了一个反馈说明,说它应该是这样的:
COUNT(*) OVER(PARTITION BY Part1, Part2) AS A
Part1 和 Part2 都是 nvarchars。
然后我停下来反思,我实际上无法弄清楚为什么这是错误的。据我所见,这实际上会产生相同的结果(确实如此)。除了在第一个查询的初始表扫描之后额外的计算标量步骤之外,实际执行计划几乎相同(这是查询成本的 0%)。I/O 统计数据显示,第一个版本的逻辑读取次数减少了 5 次(12,665 到 12,670)。
那么,除了编码约定之外,使用这两种形式有什么好处/坏处吗?在这种情况下这是否可以正常工作,但在某些情况下可能会产生不一致的结果?
解决方案
这两个表达式都是有效的,但它们的作用不同。
考虑以下数据:
Part1 Part2
AB C
A BC
当连接两个记录的字符串时,它们属于PARTITION BY Part1+Part2
同一个分区,而使用 时PARTITION BY Part1, Part2
,它们将属于不同的分区。
所以问题实际上归结为:您的用例的正确分区标准是什么?通常,除非您正在做一些花哨的事情,否则您想要PARTITION BY Part1, Part2
. 但这实际上必须根据您的实际用例从功能角度回答。
推荐阅读
- flutter - 在 Flutter 的会话期间使用 Provider 存储 JWT 是否安全?
- javascript - 在javascript中将价格乘以数量
- python - Python regex 选择现在完成时的动词
- decode - 这是什么编码?有人知道吗?
- laravel - Laravel Dompdf 错误“找不到图像或类型未知”
- amazon-web-services - 自定义资源 cloudformation 的堆栈策略
- javascript - 如何检测Angular 9中的变量变化?
- flutter - 如何添加开关来更改 Flutter App 主题?
- go - 如何更改图像的分辨率?
- python - 使用 python networkx 进行日志分箱分发