【问题标题】:Auto increment the column value by 1 conditionally in select query in sql在sql中的选择查询中有条件地自动将列值增加1
【发布时间】:2018-11-29 23:16:03
【问题描述】:

我有如下输入表:

并且在选择查询中不改变表需要如下输出:

【问题讨论】:

  • 4 应该算 3 吗?
  • 你有什么尝试吗?如果是这样,请向我们展示您的尝试。
  • 发布文字而非图片。你失去了我的答案。

标签: sql sql-server tsql dml


【解决方案1】:

您可以从添加 ROW_NUMBER() 列并过滤掉 WHERE 'nm' IS NULL 的行的 CTE 开始。

然后从您的表中 SELECT 并 OUTER JOIN 到 CTE,使用 ROW_NUMBER 列填充您的 Count 列。

【讨论】:

    【解决方案2】:

    可以根据“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( 的有趣用法。我不知道这个功能。
    • 好吧,您可以使用 CASE WHEN 代替 IIF。但 IIF 更短。
    • 是的,我不是指iif(),我指的是partition by 1 or 0。按 1 分区意味着该行不被计算,但 0 意味着它被计算,这似乎违反直觉。但由于某种原因,它确实返回了所需的结果。
    • @paparazzo 计数确实重新开始,在什么分区上。在这种情况下是 1 或 0。因此,对于那些填写了 nm 的人来说,它会继续。
    【解决方案3】:
    ;WITH CTE AS 
    (
        SELECT ID,
               ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY ID) AS [COUNT] 
        FROM [TABLE] WHERE NM IS NOT NULL 
    )
    SELECT S.ID,
           S.NM,
           CTE.[COUNT] 
    FROM [TABLE] AS S LEFT JOIN CTE AS CTE ON S.ID = CTE.ID
    

    【讨论】:

      【解决方案4】:
      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%

      在您的特定服务器上进行测试后选择您的解决方案!

      【讨论】:

      • 在您的特定服务器中测试后选择您的解决方案! LOL 我喜欢它;)
      • @Sami 很重要,因为一个系统中的最佳解决方案可能是另一个系统中更糟糕的选择。有很多参数与选择最佳解决方案有关。但是使用我们在此处的问题中的信息,我会选择我的解决方案:-)
      • +1 一种巧妙的方法,它利用了对值的计数不计算空值这一事实。而且由于不需要分区,所以这可能就是它更快的原因。
      • 一个很好的解决方案,但考虑到数据量,我不会专注于性能比较。
      猜你喜欢
      • 2013-03-17
      • 2018-11-20
      • 2010-09-13
      • 1970-01-01
      • 2022-08-07
      • 2016-11-22
      • 1970-01-01
      • 2012-01-17
      • 2021-11-03
      相关资源
      最近更新 更多