2

これは私のテーブルです

################################
# id_formfield # ID # int_Sort #
################################
#      1       # 1  #     2    #
#      2       # 1  #     3    #
#      3       # 1  #     4    #
#      4       # 1  #     4    #
#      5       # 1  #     4    #
#      6       # 2  #     1    #
#      7       # 2  #     3    #
#      8       # 2  #     3    #
#      9       # 2  #     4    #

ご覧のとおり、私のint_sort列はどういうわけか同じ番号で混乱しているので、行番号でシーケンスを作成し、IDが変更されたときに行番号をリセットしたいと思います。これは結果になるはずです:

############################################
# id_formfield # ID # int_Sort # rownumber #
############################################
#      1       # 1  #     2    #     1     #
#      2       # 1  #     3    #     2     #
#      3       # 1  #     4    #     3     #
#      4       # 1  #     4    #     4     #
#      5       # 1  #     4    #     5     #
#      6       # 2  #     1    #     1     #
#      7       # 2  #     3    #     2     #
#      8       # 2  #     3    #     3     #
#      9       # 2  #     4    #     4     #

編集:id_formfieldは私の主キーであり、int_sortの昇順で並べ替えます

4

3 に答える 3

1

次のスクリプトで開始できます。一言で言えば、スクリプト

  • 一時テーブルを作成し、IDENTITY行番号として機能する列を追加します
  • 元のデータを一時テーブルに挿入します
  • MIN(Rownumber)それぞれにを使用しIDてオフセットを取得します。
  • JOIN各グループのカウントを再開するために計算されたオフセットを含む一時テーブル。

SQLステートメント

CREATE TABLE #TempTable (Rownumber INTEGER IDENTITY(1, 1), ID INTEGER)
SET IDENTITY_INSERT #TempTable OFF

INSERT INTO #TempTable
SELECT      *
FROM        YourOriginalTable
ORDER BY    ID, int_Sort

SELECT    t.ID, t.Rownumber, t.Rownumber - o.Offset
FROM      #TempTable t
          INNER JOIN (
            SELECT    ID, MIN(Rownumber) - 1 AS Offset
            FROM      #TempTable
            GROUP BY  ID
          ) o ON o.ID = t.ID            


DROP TABLE #TempTable

テストスクリプト

DECLARE @YourTable TABLE (ID VARCHAR(1))
CREATE TABLE #TempTable (Rownumber INTEGER IDENTITY(1, 1), ID INTEGER)

SET IDENTITY_INSERT #TempTable OFF
INSERT INTO @YourTable (ID) VALUES (1)
INSERT INTO @YourTable (ID) VALUES (1)
INSERT INTO @YourTable (ID) VALUES (1)
INSERT INTO @YourTable (ID) VALUES (1)
INSERT INTO @YourTable (ID) VALUES (1)
INSERT INTO @YourTable (ID) VALUES (2)
INSERT INTO @YourTable (ID) VALUES (2)
INSERT INTO @YourTable (ID) VALUES (2)
INSERT INTO @YourTable (ID) VALUES (2)

INSERT INTO #TempTable
SELECT      *
FROM        @YourTable
ORDER BY    ID

SELECT    t.ID, t.Rownumber, t.Rownumber - o.Offset
FROM      #TempTable t
          INNER JOIN (
            SELECT    ID, MIN(Rownumber) - 1 AS Offset
            FROM      #TempTable
            GROUP BY  ID
          ) o ON o.ID = t.ID            


DROP TABLE #TempTable
于 2012-05-21T10:30:55.597 に答える
1

テーブルに呼び出される主キーがありPK、列を更新するとしますint_sort

select cast(PK as int) as PK,
       ID,
       identity(int, 1, 1) as rownumber
into #T
from YourTable
order by ID, int_sort

update YourTable
set int_sort = T.rownumber - T2.rownumber + 1 
from #T as T
  inner join (
               select ID, min(rownumber) as rownumber
               from #T
               group by ID
             ) as T2
    on T.ID = T2.ID
where T.PK = YourTable.PK


drop table #T
于 2012-05-21T10:52:00.137 に答える
1

主キー列の名前はであると仮定しましidpkた。次のクエリを使用して、目的の行番号を取得できます。

SELECT ts.id, ts.int_sort,
  (SELECT count(*) FROM tosort
    WHERE id = ts.id AND int_sort <= ts.int_sort
      AND idpk <= ts.idpk) AS row_number
  FROM tosort AS ts
 ORDER BY ts.id, ts.int_sort, ts.idpk;

SQL Fiddleでサンプルケースを作成しましたが、そこでは2008R2しか使用できません。これがSQLServer2000で機能することを願っています。

于 2012-05-21T10:54:58.630 に答える