为同一个id编号行

时间:2013-09-23 15:04:17

标签: sql-server

我想在我的表中添加一个新列,所以我做了:

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    |

现在我想计算每个id的行数,而同一个Id的第一行以“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 个答案:

答案 0 :(得分:2)

ROW_NUMBER功能可以做到:

SQL Fiddle

MS SQL Server 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()的{​​{1}}子句分为两部分。 OVER() bart告诉SQL Server将每个PARTITION BY值的计数器重置为1。 id部分允许指定每个分区中行的计数顺序。

答案 1 :(得分: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