我想在我的表中添加一个新列,所以我做了:
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
我该怎么办呢?
答案 0 :(得分:2)
ROW_NUMBER
功能可以做到:
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