sql >> データベース >  >> RDS >> Sqlserver

T-sqlフィールド変更時に行番号をリセット

    SQL Server 2012を使用している場合は、LAG を使用できます。 値を前の行と比較するには、SUM を使用できます。 および OVER 変更を記録します。

    with C1 as
    (
      select custno,
             moddate,
             who,
             lag(who) over(order by moddate) as lag_who
      from chr
    ),
    C2 as
    (
      select custno,
             moddate,
             who,
             sum(case when who = lag_who then 0 else 1 end) 
                over(order by moddate rows unbounded preceding) as change 
      from C1
    )
    select row_number() over(partition by change order by moddate) as RowID,
           custno,
           moddate,
           who
    from C2
    

    SQLフィドル

    更新:

    SQL Server 2005のバージョン。反復する必要のあるデータの中間ストレージとして、再帰CTEと一時テーブルを使用します。

    create table #tmp
    (
      id int primary key,
      custno int not null,
      moddate datetime not null,
      who varchar(10) not null
    );
    
    insert into #tmp(id, custno, moddate, who)
    select row_number() over(order by moddate),
           custno,
           moddate,
           who
    from chr;
    
    with C as
    (
      select 1 as rowid,
             T.id,
             T.custno,
             T.moddate,
             T.who,
             cast(null as varchar(10)) as lag_who
      from #tmp as T
      where T.id = 1
      union all
      select case when T.who = C.who then C.rowid + 1 else 1 end,
             T.id,
             T.custno,
             T.moddate,
             T.who,
             C.who
      from #tmp as T
        inner join C
          on T.id = C.id + 1
    )
    select rowid,
           custno,
           moddate,
           who
    from C
    option (maxrecursion 0);
    
    drop table #tmp;
    

    SQL Fiddle



    1. 統合輸送データモデル

    2. 'PROCEDURE'postgresqlの近くの構文が正しくありません

    3. SQLパフォーマンスチューニングが最も重要なデータベース管理スキルである理由

    4. PHPスクリプトに間違いが見つかりません