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    |

现在我想计算每个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

请问我该怎么做?

4

2 回答 2

2

ROW_NUMBER功能可以做到这一点:

SQL小提琴

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;

结果

|   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;

结果

|   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;

结果

|   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()sOVER()子句有两个部分。bart 告诉 SQL Server将每个值PARTITION BY的计数器重置为 1 。idORDER BY部分允许指定在每个分区内计算行的顺序。

于 2013-09-23T15:15:42.387 回答
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
于 2013-09-23T15:11:37.327 回答