2013-09-23 2 views
0

Я хочу, чтобы добавить новый столбец к моему столу, так что я сделал:номер строки для того же идентификатора

ALTER TABLE myTable ADD pixelorder int 

теперь моя таблица выглядит следующим образом:

id  | name | pixelorder 
---------------------------- 
1525 | a | 
1528 | b | 
1525 | w | 
1526 | b | 
1526 | v | 
1528 | c | 
1525 | b | 

Я отсортировали строки по ID:

select * from myTable order by id asc 

id  | name | pixelorder 
---------------------------- 
1525 | a | 
1525 | w | 
1525 | b | 
1526 | b | 
1526 | v | 
1528 | b | 
1528 | c | 

и теперь я хочу, чтобы подсчитать строки для каждого идентификатора, в то время как первая строка одного и того же идентификатора начинается с «1», второй 2, и т.д.).

так, для моего примера:

id  | name | pixelorder 
---------------------------- 
1525 | a | 1 
1525 | w | 2 
1525 | b | 3 
1526 | b | 1 
1526 | v | 2 
1528 | b | 1 
1528 | c | 2 

как я могу это сделать, пожалуйста?

ответ

2

ROW_NUMBER функция может сделать:

SQL Fiddle

сервера Настройка MS SQL 2008 схемы:

CREATE TABLE dbo.MyTable 
    ([id] int, [name] varchar(1)) 
; 

INSERT INTO MyTable 
    ([id], [name]) 
VALUES 
    (1525, 'a'), 
    (1528, 'b'), 
    (1525, 'w'), 
    (1526, 'b'), 
    (1526, 'v'), 
    (1528, 'c'), 
    (1525, 'b') 
; 

------------------------------------ 

ALTER TABLE dbo.MyTable ADD pixelorder int; 

------------------------------------ 

Запрос 1:

SELECT * FROM dbo.MyTable; 

Results:

| ID | NAME | PIXELORDER | 
|------|------|------------| 
| 1525 | a |  (null) | 
| 1528 | b |  (null) | 
| 1525 | w |  (null) | 
| 1526 | b |  (null) | 
| 1526 | v |  (null) | 
| 1528 | c |  (null) | 
| 1525 | b |  (null) | 

Запрос 2:

SELECT *,ROW_NUMBER()OVER(PARTITION BY id ORDER BY name) AS rn 
FROM dbo.MyTable; 

Results:

| ID | NAME | PIXELORDER | RN | 
|------|------|------------|----| 
| 1525 | a |  (null) | 1 | 
| 1525 | b |  (null) | 2 | 
| 1525 | w |  (null) | 3 | 
| 1526 | b |  (null) | 1 | 
| 1526 | v |  (null) | 2 | 
| 1528 | b |  (null) | 1 | 
| 1528 | c |  (null) | 2 | 

Запрос 3:

UPDATE t 
    SET pixelorder = rn 
FROM (
    SELECT *,ROW_NUMBER()OVER(PARTITION BY id ORDER BY name) AS rn 
    FROM dbo.MyTable 
)t; 


SELECT * FROM dbo.MyTable; 

Results:

| ID | NAME | PIXELORDER | 
|------|------|------------| 
| 1525 | a |   1 | 
| 1528 | b |   1 | 
| 1525 | w |   3 | 
| 1526 | b |   1 | 
| 1526 | v |   2 | 
| 1528 | c |   2 | 
| 1525 | b |   2 | 

Запрос 2 показывает, как использовать функцию ROW_NUMBER() в SELECT запросе. Query3 показывает, как использовать его в инструкции обновления.

Предложение ROW_NUMBER()OVER() состоит из двух частей.Барда PARTITION BY сообщает SQL Server сбросить счетчик на 1 для каждого значения id. Часть ORDER BY позволяет указать порядок, в котором строки подсчитываются в каждом разделе.

1

ROW_NUMBER() - функция ранжирования, которая генерирует последовательное число. Генерация числа была выполнена внутри рекурсивного CTE, поэтому мы можем обновить pixelorder. Однако это также можно сделать с помощью подзапроса.

WITH records 
AS 
(
    SELECT id, name, pixelorder, 
      ROW_NUMBER() OVER (PARTITION BY id ORDER BY name) rn 
    FROM tableName 
) 
UPDATE records 
SET pixelOrder = rn 
Смежные вопросы