【问题标题】:increment if not same value of next column in SQL如果 SQL 中下一列的值不同,则递增
【发布时间】:2021-02-05 07:55:55
【问题描述】:

我正在尝试在 SQL 中使用行号。但是,它没有提供所需的输出。

数据:

ID   Name  Output should be
111   A     1
111   B     2
111   C     3
111   C     3
111   A     4

222   A     1
222   A     1
222   B     2 
222   C     3 
222   B     4
222   B     4

【问题讨论】:

  • 您为什么使用不受支持的软件? SQL Server 2008 多年来一直不受支持。 SQL 表也代表 无序 集。除非列指定顺序,否则您的问题毫无意义。

标签: sql sql-server sql-server-2008 window-functions gaps-and-islands


【解决方案1】:

这是一个孤岛问题。作为一个初学者:为了让这个问题有意义,你需要一个定义行顺序的列——我假设ordering_id。然后,我建议lag() 获得“以前的”name,以及每次相邻行中name 更改时增加的累积sum()

select id, name,
    sum(case when name = lag_name then 0 else 1 end) over(partition by id order by ordering_id) as rn
from (
    select t.*, lag(name) over(partition by id order by ordering_id) lag_name
    from mytable t
) t

【讨论】:

    【解决方案2】:

    SQL Server 2008 使这变得更加棘手。您可以使用不同的行号来识别相邻的行。然后你可以在每个岛上分配最小的id并使用dense_rank()

    select t.*,
           dense_rank() over (partition by name order by min_ordcol) as output
    from (select t.*,
                 min(<ordcol>) over (partition by name, seqnum - seqnum_2) as min_ordcol
          from (select t.*,
                       row_number() over (partition by name order by <ordcol>) as seqnum,
                       row_number() over (partition by name, id order by <ordcol>) as seqnum_2
                from t
               ) t
          ) t;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      相关资源
      最近更新 更多