2016-01-20 60 views
1

我有一個Update語句,它可以識別一個字段中的重複值,並找到每個值,我希望在日期/時間字段中增加一分鐘時間。我無法更改重複值,因爲它會中斷項目的其他部分。增加表中整數的函數

我的代碼是目前:

UPDATE table 
SET Date = GETDATE() 
Where Seq in (Select Seq from table 
Group By Seq 
Having COUNT(Seq) > 1) 

目前,它設置的所有日期的同一時間。我將如何設置日期以便每個人獲得一個獨特的時間?

我想是這樣的:

SET Date = DATEADD(Mi,1, Date) 

這通過對所有記錄1分鐘爲增量了。我如何分別觸摸它們?

+0

您使用MSSQL/ORACLE/MYSQL? – ymz

+1

MSSQL - 我以爲我標記的SQL服務器 – alcor8

回答

3

可以使用ROW_NUMBERCTE

WITH CTE AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) 
    FROM Seq 
    WHERE Seq IN(SELECT Seq FROM Seq GROUP BY Seq HAVING COUNT(Seq) > 1) 
) 
UPDATE CTE 
    SET Date = DATEADD(MINUTE, rn, GETDATE()) 
+0

這工作在一個測試環境。我謹慎使用它在實時數據上。但生活就是冒險。 – alcor8

+0

確保備份您的數據。 –

+0

有沒有辦法增加1而不是表中的行數?傳入數據饋送的大小可能會發生變化(因爲較新的數據進入,但重複數據不會丟失幾天),而重複數量將保持不變。 – alcor8

0

試試這個:

UPDATE table 
SET Date = DATEADD(Mi,1, Date) 
Where ROWID in (Select MIN(t.ROWID) from table t 
Group By Seq 
Having COUNT(Seq) > 1); 
0

使用RANKROW_NUMBER導出numberof分鐘添加到組中的每個日期(如果另一種方法我已經正確解釋你的問題)。

應該高達2012上工作(你不提的SQL Server您正在使用的版本)

CREATE TABLE #Seq(seq INT,date DATETIME2); 

DECLARE @Now DATETIME2 = SYSDATETIME(); 

INSERT INTO #Seq 
    (seq, date) 
VALUES 
    (0, DATEADD(MINUTE, 1, @Now)) 
    ,(0, DATEADD(MINUTE, 2, @Now)) 
    ,(0, DATEADD(MINUTE, 3, @Now)) 
    ,(1, DATEADD(MINUTE, 10, @Now)) 
    ,(1, DATEADD(MINUTE, 10, @Now)) 
    ,(1, DATEADD(MINUTE, 10, @Now)) 
    ,(2, DATEADD(MINUTE, 20, @Now)) 
    ,(2, DATEADD(MINUTE, 21, @Now)) 
    ,(2, DATEADD(MINUTE, 22, @Now)); 

SELECT * FROM #Seq; 

WITH CTE AS(
SELECT 
    SEQ 
    ,Date 
    ,ROW_NUMBER() OVER (PARTITION BY seq ORDER BY Date) rn 
    ,RANK() OVER (PARTITION BY seq ORDER BY Date) rnk 
FROM #seq 
) 
UPDATE CTE SET Date = DATEADD(MINUTE, (rn-rnk), Date); 

SELECT * FROM #Seq;