【发布时间】:2017-02-01 00:15:57
【问题描述】:
我发现这种行为非常奇怪且违反直觉。 (即使是 SQL)。
set ansi_nulls off
go
;with sampledata(Value, CanBeNull) as
(
select 1, 1
union
select 2, 2
union
select 3, null
union
select 4, null
union
select 5, null
union
select 6, null
)
select ROW_NUMBER() over(partition by CanBeNull order by value) 'RowNumber',* from sampledata
返回
1 3 NULL
2 4 NULL
3 5 NULL
4 6 NULL
1 1 1
1 2 2
这意味着为了计算行号,所有空值都被视为同一组的一部分。 SET ANSI_NULLLS 是打开还是关闭都没有关系。 但是由于根据定义,null 是完全未知的,那么如何将 null 像这样组合在一起呢?据说,为了将苹果和橙子、负 1 的平方根和量子黑洞或任何可以有意义地排序的东西按顺序排列。一个小实验表明,第一列用于生成排名顺序为
select 1, '1'
union
select 2, '2'
union
select 5, null
union
select 6, null
union
select 3, null
union
select 4, null
生成相同的值。这具有重大影响,导致我正在处理的遗留代码出现问题。这是预期的行为吗?除了用唯一值替换 select 查询中的 null 之外,还有什么方法可以缓解它?
我预期的结果会是
1 3 NULL
1 4 NULL
1 5 NULL
1 6 NULL
1 1 1
1 2 2
使用 Dense_Rank() 没有区别。
【问题讨论】:
-
PARTITION BY构建组,这不是一致的吗?GROUP BY的作用与 SQL:2003 标准中记录的相同。 Read -
阅读。但是一个组在组内没有固有的顺序 - 分区确实会创建这样的顺序,因此根本不同
标签: sql-server null row-number