【问题标题】:Remove column redundancy by increment通过增量删除列冗余
【发布时间】:2012-07-26 14:29:42
【问题描述】:

我有下表:

如您所见,我重复了日期和时间值,例如 2012-01-01 09:29:00.000 和 2012-01-01 09:29:00.008。

我需要您的帮助,通过在重复的小时数上增加毫秒来消除冗余并获得以下结果:

所以我创建了一个表 TableSource 并尝试在没有 redondonce 的情况下插入新的输出值但我没有成功。

我认为以下查询可以解决问题,但它只适用于 My-sql :

INSERT INTO TableDestination
SELECT * FROM TableSource
    ON DUPLICATE KEY
UPDATE  NeededDateRow = DATEADD(millisecond,1 , NeededDateRow)

【问题讨论】:

  • 您希望在重复的日期时间中添加特定的毫秒数吗?或者它可能是一个随机数? (出于好奇:您为什么不想在您的专栏中出现重复的日期时间?)
  • 我只需要添加毫秒来区分日期可以是随机的。我不想要重复值,因为我在 oder 查询中使用它作为主键,这会导致重复日期出现问题。谢谢。
  • @Tlachtga 在下面查看我的答案,它应该可以帮助您解决问题

标签: sql sql-server sql-server-2008 tsql sqlite


【解决方案1】:

你可以用这个:

    DECLARE @table table (id int, dt datetime)
DECLARE @table2 table (id int, dt datetime)
INSERT INTO @table 
SELECT 1, '2012/01/01'
UNION
SELECT 2, '2012/01/01'
UNION
SELECT 3, '2012/01/01'
UNION
SELECT 1, '2012/01/02'

SELECT * , DATEADD(millisecond, 10 * (ROW_NUMBER() OVER (PARTITION BY dt ORDER BY dt) - 1), dt) As NewDate
FROM @table 

INSERT INTO @table2
SELECT ID, DATEADD(millisecond, 10 * (ROW_NUMBER() OVER (PARTITION BY dt ORDER BY dt) - 1)  , dt) FROM @table 

SELECT * from @table2 

【讨论】:

  • 感谢您的回答,选择查询似乎有效,但是当我尝试更新时出现以下错误:窗口函数只能出现在 SELECT 或 ORDER BY 子句中。
  • 检查我更新的答案,您可以使用 select 插入,它会以正确的顺序将日期列插入 TableDestination。
  • 效果很好,非常感谢!我会更喜欢你的第一个解决方案,更新同一张表,这是不可能的吗?
  • 对不起,我认为不是,您不能直接在更新中使用 row_number。
  • 好的,谢谢,我将使用 delete from table1 并插入 table1 select * from table2
【解决方案2】:

MSSQL 中没有等效的INSERT ... ON DUPLICATE KEY,但是, MERGEWHEN NOT MATCHED 可能适合您。

你可以参考this answer

我只是起草了 sql 语法(未经测试)

MERGE TableDestination AS T
USING TableSource AS S
ON (T.NeededDateRow = S.NeededDateRow)
WHEN NOT MATCHED
    THEN INSERT (NeededDateRow) VALUES (DateAdd(millisecond,1,NeededDateRow))

【讨论】:

  • thx 但我已经看到了那个答案,并且合并查询对我不起作用,因为在我的情况下,我需要使用 WHEN MACHED THEN INSERT (NeededDateRow) VALUES (DateAdd(millisecond,1, NeededDateRow) WHEN NOT MATCHED THEN INSERT (NeededDateRow) 并且当 MATCHED 时插入不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 2021-03-20
  • 1970-01-01
  • 2023-01-31
相关资源
最近更新 更多