小编Sim*_*onN的帖子

SQL Server - 按空值划分的 ROW_NUMBER 分区的行为

我发现这种行为非常奇怪且违反直觉。(即使对于 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
Run Code Online (Sandbox Code Playgroud)

哪个返回

1   3   NULL
2   4   NULL
3   5   NULL
4   6   NULL
1   1   1
1   2   2
Run Code Online (Sandbox Code Playgroud)

这意味着为了计算行号,所有空值都被视为同一组的一部分。SET ANSI_NULLLS 是打开还是关闭都没有关系。但是,根据定义,null 是完全未知的,那么如何将 null 像这样组合在一起呢?据说为了将事物按等级顺序排列,苹果和橙子以及负 1 的平方根和量子黑洞或任何可以有意义地排序的东西。一些实验表明,第一列用于生成排名顺序为

  select 1, '1'
  union 
  select 2, '2' …
Run Code Online (Sandbox Code Playgroud)

sql-server null row-number

4
推荐指数
1
解决办法
2万
查看次数

GetDate()是否具有确定性

这是一种哲学问题.在一次采访中,我出席了GetDate,作为一个非确定性函数的例子.我明白为什么这个论点有水; 但这对我来说似乎是一个似是而非的争论.

详细说明:对于给定的实例及时(在100微秒范围内),getdate将返回特定值.

对于运行到相同时钟时间的两台计算机(通过足够精确的时钟同步),它们将返回相同的getdate值.

所以这是确定性的.

可以认为getdate在不同的时间返回不同的值,因此不能将其描述为确定性的.

但是sql查询"从y得到x,其中主键等于z"将返回x的相同值,其中z是相同的值.因此,如果时钟固定为某个值,那么我们将始终获得相同的getdate值.

换句话说,getdate的值由外部参数确定,与使用where子句的SQL查询完全相同的方式由where子句参数控制.

那么我们为什么要暗示getdate是非确定性的,而select查询中提供结果的任何其他变量参数都被描述为确定性的.

只是为了扩展问题; 如果数据发生变化,那么我们会在select查询中收到不同的值,然后我们解释这些值不会影响确定性(硬币化一个单词),因为值已经及时更改,就像getdate一样.

要扩展(作为编辑),我可以使用XP_CmdShell设置特定日期,然后立即运行GetDate(); 忽略了系统速度的变幻莫测等等.然后我会得到相同的答案.这有效地否定了系统日期时间不是输入的论点,因为我通过SQL修改了它,因此将整个过程保持在SQL控制的循环中.

t-sql theory sql-server

2
推荐指数
1
解决办法
1355
查看次数

标签 统计

sql-server ×2

null ×1

row-number ×1

t-sql ×1

theory ×1