2016-04-22 78 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。 –