Sql server SQL Server-按空值划分行数的行为

Sql server SQL Server-按空值划分行数的行为,sql-server,null,row-number,Sql Server,Null,Row Number,我觉得这种行为很奇怪,而且违反直觉。(甚至对于SQL) 返回 1 3 NULL 2 4 NULL 3 5 NULL 4 6 NULL 1 1 1 1 2 2 这意味着为了计算行号,所有空值都被视为同一组的一部分。设置ANSI_nulls是打开还是关闭都没有关系。 但是,因为根据定义,空值是完全未知的,那么如何才能像这样将空值分组在一起呢?这是说,为了将事物按顺序排列,苹果和桔子,负1的平方根,量子黑洞或其他任何东西都可以有意义地排序。一些实验表明

我觉得这种行为很奇怪,而且违反直觉。(甚至对于SQL)

返回

1   3   NULL
2   4   NULL
3   5   NULL
4   6   NULL
1   1   1
1   2   2
这意味着为了计算行号,所有空值都被视为同一组的一部分。设置ANSI_nulls是打开还是关闭都没有关系。 但是,因为根据定义,空值是完全未知的,那么如何才能像这样将空值分组在一起呢?这是说,为了将事物按顺序排列,苹果和桔子,负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
使用densite_Rank()没有任何区别。

Yo

因此,当T-SQL处理谓词中的空值时,它使用三元逻辑(TRUE、FALSE或UNKNOWN),并显示您所声明的查询所期望的行为。但是,在对值进行分组时,T-SQL将null视为一个组。因此,您的查询将把空值分组在一起,并开始对该窗口中的行进行编号

对于您希望看到的结果,此查询应该可以工作

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
    DENSE_RANK() OVER (PARTITION BY CanBeNull ORDER BY CASE WHEN CanBeNull IS NOT NULL THEN value END ASC) as RowNumber
    ,Value
    ,CanBeNull
FROM sampledata

partitionby
构建组,所以它不一致吗<代码>分组依据的做法与SQL:2003标准中的做法相同。读一下。但是一个组在组内没有一个固有的顺序-分区确实创建了这样一个顺序,因此是根本不同的
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
    DENSE_RANK() OVER (PARTITION BY CanBeNull ORDER BY CASE WHEN CanBeNull IS NOT NULL THEN value END ASC) as RowNumber
    ,Value
    ,CanBeNull
FROM sampledata