2016-04-22 77 views
-1

我在Microsoft SQL如下表结构: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语句或更高级的语句。

回答

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

3

使用ROW_NUMBER

SELECT ID, Name, 
     ROW_NUMBER() OVER (PARTITION BY Name 
          ORDER BY ID) AS Number 
FROM mytable 

没有必要添加一个字段这一点,因为该值可以使用窗口功能很容易计算。

0

如果您的系统犯规支持通过分区,您可以使用下面的代码:

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不支持OVER PARTITION,比如MySQL,Maria,...

+0

这很好,除了问题外,其他所有问题都清楚地标记为sql server。 –