2013-08-25 45 views
14

Tôi đang cố gắng thêm cột mới vào bảng hiện có, trong đó giá trị là số thứ tự/thứ tự hàng. Tôi cần một cách để tạo ra các số hàng/giá trị xếp hạng, và tôi cũng cần phải hạn chế các hàng bị ảnh hưởng - trong trường hợp này, sự hiện diện của một chuỗi con trong một chuỗi.Cách thêm cột số hàng trong SQL Server 2012

Ngay bây giờ tôi có:

UPDATE table 
SET row_id=ROW_NUMBER() OVER (ORDER BY col1 desc) FROM table 
WHERE CHARINDEX('2009',col2) > 0 

Và tôi nhận được lỗi này:

Windowed functions can only appear in the SELECT or ORDER BY clauses. 

(Same lỗi cho RANK())

Có cách nào để tạo/cập nhật một cột với hàm ROW_NUMBER()? FYI, điều này có nghĩa là để thay thế một cột "xếp hạng" đã tồn tại không chính xác.

+0

Bạn có thể bao gồm những cột nào trong bảng của mình, ít nhất là các cột bạn định sắp xếp theo, tìm kiếm và cập nhật không? – dcaswell

Trả lời

24

Bạn có thể làm điều này với một CTE, một cái gì đó như:

with cte as 
(
    select * 
    , new_row_id=ROW_NUMBER() OVER (ORDER BY col1 desc) 
    from MyTable 
    where charindex('2009',col2) > 0 
) 
update cte 
set row_id = new_row_id 

SQL Fiddle with demo.

+0

Cảm ơn bạn, nó đã hoạt động khi tôi tạo một row_id trước. –

-1

workaround đơn giản là tạo ra một bảng tạm thời trông giống như

CREATE TABLE #temp (id int, cấp bậc int)

đâu id là loại giống như khóa chính trong bảng chính bạn.

Chỉ cần sử dụng SELECT INTO đầu tiên điền bảng temp và sau đó cập nhật từ bảng temp ...

1

Nếu bạn chỉ cập nhật một vài ngàn hàng, bạn có thể thử một cái gì đó như thế này:

select 'UPDATE MyTable SET ID = ' + CAST(RowID as varchar) + ' WHERE ID = ' + CAST(ID as varchar) 
From (
select MyTable, ROW_NUMBER() OVER (ORDER BY SortColumn) RowID from RaceEntry 
where SomeClause and SomeOtherClause 
) tbl 

Sao chép và dán kết quả truy vấn vào trình soạn thảo truy vấn và chạy. Đó là một chút chậm chạp và bit yukky nó hoạt động.