2012-05-21 21 views
2

這是我的表SQL 2000行與GROUP編號BY

################################ 
# 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上升

+0

你在這個表中有主鍵嗎? –

+0

是的,我也是,另一列沒有提及 – mhesabi

+0

請指定字段(或字段的組合):1)唯一標識記錄2)定義行的排序。沒有這兩點,結果將是不可預測的。 – vyegorov

回答

1

下面的腳本應該讓你開始。簡而言之,該腳本

  • 創建一個臨時表,添加IDENTITY列到你的原始數據作爲ROWNUMBER
  • 插入到臨時表
  • 使用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 
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 
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樣品的情況下,雖然只有2008 R2可有。 我希望這可以在SQL Server 2000上工作。