我在Microsoft SQL中有以下表结构:
ID Name Number
1 John
2 John
3 John
4 Mark
5 Mark
6 Anne
7 Anne
8 Luke
9 Rachael
10 Rachael
我希望设置'数字'字段的次数'名称'字段先前已出现,使用SQL。
所需的输出如下:
ID Name Number
1 John 1
2 John 2
3 John 3
4 Mark 1
5 Mark 2
6 Anne 1
7 Anne 2
8 Luke 1
9 Rachael 1
10 Rachael 2
该表按“姓名”排序,因此不用担心约翰'使用我的例子再次出现在ID 11下。
任何帮助将不胜感激。我不确定我是否可以使用简单的SELECT语句执行此操作,或者是否需要UPDATE语句或更高级的语句。
答案 0 :(得分:3)
使用ROW_NUMBER
:
SELECT ID, Name,
ROW_NUMBER() OVER (PARTITION BY Name
ORDER BY ID) AS Number
FROM mytable
无需为此添加字段,因为可以使用窗口函数轻松计算值。
答案 1 :(得分:1)
您应该能够使用SQL Server中的ROW_NUMBER()
函数对每个组进行分区(按其Name
属性)并输出每个分区中的单个行:
SELECT ID,
Name,
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY ID) AS Number
FROM YourTable
ORDER BY ID
您可以在查询之前查看数据的外观:
然后执行后:
答案 2 :(得分:0)
如果您的系统不支持OVER PARTITION,您可以使用以下代码:
SELECT
ID,
Name,
(
SELECT
SUM(counterTable.nameCount)
FROM
mytable innerTable
JOIN (SELECT 1 as nameCount) as counterTable
WHERE
innerTable.ID <= outerTable.ID
AND outerTable.Name = innerTable.Name
) AS cumulative_sum
FROM
mytable outerTable
ORDER BY outerTable.ID
在CREATE TABLE语句之后,我使用了然后填写了您的数据:
CREATE TABLE `mytable` (
`ID` INT(11) NULL DEFAULT NULL,
`Name` VARCHAR(50) NULL DEFAULT NULL
);
这应该适用于DBS不支持像MySQL,Maria这样的OVER PARTITION ......