我有一个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 :(得分: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)
另一种方法是使用RANK
和ROW_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;