2016-01-20 26 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;