【发布时间】:2018-11-29 23:16:03
【问题描述】:
我有如下输入表:
并且在选择查询中不改变表需要如下输出:
【问题讨论】:
-
4应该算 3 吗? -
你有什么尝试吗?如果是这样,请向我们展示您的尝试。
-
发布文字而非图片。你失去了我的答案。
标签: sql sql-server tsql dml
我有如下输入表:
并且在选择查询中不改变表需要如下输出:
【问题讨论】:
4 应该算 3 吗?
标签: sql sql-server tsql dml
您可以从添加 ROW_NUMBER() 列并过滤掉 WHERE 'nm' IS NULL 的行的 CTE 开始。
然后从您的表中 SELECT 并 OUTER JOIN 到 CTE,使用 ROW_NUMBER 列填充您的 Count 列。
【讨论】:
可以根据“nm”是否为空来计算一个row_number,然后只在“nm”不为空时显示计算出来的row_number。
示例 sn-p:
declare @T table (id int identity(1,1) primary key, nm varchar(8));
insert into @T (nm) values ('R'),('R'),(null),('R');
select *,
iif(nm is null,null,row_number() over (partition by iif(nm is null,1,0) order by id)) as [Count]
from @T
order by id
【讨论】:
partition by iif( 的有趣用法。我不知道这个功能。
iif(),我指的是partition by 1 or 0。按 1 分区意味着该行不被计算,但 0 意味着它被计算,这似乎违反直觉。但由于某种原因,它确实返回了所需的结果。
drop table if exists T;
create table T(id int, nm nvarchar(10))
GO
insert T(id, nm) values (1,'r'),(2,'r'),(3,null),(4,'r')
SELECT * FROM T
GO
-- solution:
select
id, nm,
CASE WHEN nm is not null then count(nm) over (order by id) ELSE NULL END
from T
GO
比较所有解决方案的执行计划(使用 SQL 2017):-)
我的解决方案 21%; LukStorms 溶液 38%; Ian-Fogelman 溶液 41%
【讨论】: