首页 > 解决方案 > 在 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)。

那么,除了编码约定之外,使用这两种形式有什么好处/坏处吗?在这种情况下这是否可以正常工作,但在某些情况下可能会产生不一致的结果?

标签: sqlsql-servertsqlcountwindow-functions

解决方案


这两个表达式都是有效的,但它们的作用不同。

考虑以下数据:

Part1    Part2
AB       C
A        BC

当连接两个记录的字符串时,它们属于PARTITION BY Part1+Part2同一个分区,而使用 时PARTITION BY Part1, Part2,它们将属于不同的分区。

所以问题实际上归结为:您的用例的正确分区标准是什么?通常,除非您正在做一些花哨的事情,否则您想要PARTITION BY Part1, Part2. 但这实际上必须根据您的实际用例从功能角度回答。


推荐阅读