函数增加表中的整数

时间:2016-01-20 01:08:59

标签: sql sql-server

我有一个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分钟。如何单独触摸它们?

3 个答案:

答案 0 :(得分:3)

您可以在ROW_NUMBER中使用CTE

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())

答案 1 :(得分: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);

答案 2 :(得分:0)

另一种方法是使用RANKROW_NUMBER来计算添加到组中每个日期的分钟数(如果我已正确解释您的问题)。

应该在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;