【问题标题】:Resetting row number according to column value T-SQL根据列值重置行号T-SQL
【发布时间】:2018-07-11 11:15:58
【问题描述】:

我得到了以下数据,其中有一列表示我们称之为剧集的第一条记录,尽管没有剧集 ID。 ID列表示个人。

ID  StartDate   EndDate     First_Record
1   2013-11-30  2013-12-08  0
1   2013-12-08  2013-12-14  NULL
1   2013-12-14  2013-12-16  NULL
1   2013-12-16  2013-12-24  NULL
2   2001-02-02  2001-02-02  0
2   2001-02-03  2001-02-05  NULL
2   2010-03-11  2010-03-15  0
2   2010-03-15  2010-03-23  NULL
2   2010-03-24  2010-03-26  NULL 

我正在尝试获取一个指示行号(从 0 开始)按开始日期排序的 ID 分组的列,但是基本上,当 First_Record 列不为空时,行号需要重置。因此所需的输出列深度。

ID  StartDate   EndDate     First_Record    Depth
1   2013-11-30  2013-12-08  0               0
1   2013-12-08  2013-12-14  NULL            1
1   2013-12-14  2013-12-16  NULL            2
1   2013-12-16  2013-12-24  NULL            3
2   2001-02-02  2001-02-02  0               0
2   2001-02-03  2001-02-05  NULL            1
2   2010-03-11  2010-03-15  0               0
2   2010-03-15  2010-03-23  NULL            1
2   2010-03-24  2010-03-26  NULL            2

虽然我找到了类似的thread,但我似乎想不出任何解决方案,但我需要帮助将其转化为我想要做的事情。它必须使用 First_Record 列,因为它是根据特定条件设置的。任何帮助表示赞赏

【问题讨论】:

    标签: sql sql-server-2008 tsql


    【解决方案1】:

    如果您每人只能拥有一集(如您的示例数据中所示),您可以使用row_number():

    select t.*, row_number() over (partition by id order by startDate) - 1 as depth
    from t;
    

    否则,您可以使用累积和计算剧集分组,然后使用它:

    select t.*,
           row_number() over (partition by id, grp order by startDate) - 1 as depth
    from (select t.*,
                 count(first_record) over (partition by id order by startdate) as grp
          from t
         ) t;
    

    【讨论】:

      【解决方案2】:

      现在深度将从 0 开始。

      SELECT t.*
          ,convert(INT, (
                  row_number() OVER (
                      PARTITION BY id ORDER BY startDate
                      )
                  )) - 1 AS Depth
      FROM t;
      

      【讨论】:

      • 转换为int redundunt
      猜你喜欢
      • 1970-01-01
      • 2019-03-25
      • 2012-11-04
      • 1970-01-01
      • 2021-03-27
      • 2018-05-06
      • 1970-01-01
      • 2020-10-24
      • 2023-02-03
      相关资源
      最近更新 更多