SQL - 根据先前行值的计数设置字段值

时间:2016-04-22 14:08:03

标签: sql sql-server database

我在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语句或更高级的语句。

3 个答案:

答案 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

您可以在查询之前查看数据的外观:

enter image description here

然后执行后:

enter image description here

答案 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 ......