我有一个包含7列主键的表:
Istituto,Filiale,Cdg,Progressivo,DataInserimento,Operatore,Testo
前4列是键,并且有时间记录有simil键(相同的Istituto,Cdg和Progressivo)但是同样的DataInserimento(这是DATETIME字段),我会找到这个记录并更改一个(或更多,如果有更多比两个记录具有相同的日期和Cdg)为彼此的不同日期添加100毫秒。
例如:
Istituto Filiale cdg Progressivo DataInserimento Operatore Testo
1 12 456 1 12/11/2015 12:00:00:200 UGO QUALCOSA
1 123 456 1 12/11/2015 12:00:00:200 UGO QUALCOSA2
1 124 456 1 12/11/2015 12:00:00:200 UGO QUALCOSA3
我想在查询之后这样做:
Istituto Filiale cdg Progressivo DataInserimento Operatore Testo
1 12 456 1 12/11/2015 12:00:00:200 UGO QUALCOSA
1 123 456 1 12/11/2015 12:00:00:300 UGO QUALCOSA2
1 124 456 1 12/11/2015 12:00:00:400 UGO QUALCOSA3
我能解决这个问题吗?
答案 0 :(得分:1)
在此UPDATE中,如果存在具有相同3个主键字段的另一行(Filiale除外),则更改dataInserimento在行的前一行的基础上添加100 ms的倍数 试试这个:
UPDATE yourtable
SET dataInserimento = DATEADD(ms, 100 *
(SELECT COUNT(*)
FROM yourtable T3
WHERE T3.Istituto = yourtable.Istituto
AND T3.cdg = yourtable.cdg
AND T3.Progressivo = yourTable.Progressivo
AND T3.filiale < yourTable.filiale)
, dataInserimento)
WHERE EXISTS(
SELECT 'next'
FROM yourtable t2
WHERE T2.Istituto = yourtable.Istituto
AND T2.cdg = yourtable.cdg
AND T2.Progressivo = yourTable.Progressivo
AND T2.filiale < yourTable.filiale
)
答案 1 :(得分:1)
你可以这样做:
UPDATE ToUpdate SET DataInserimento = SQ.NewDate
FROM TheTable ToUpdate
JOIN (
SELECT T.Istituto, T.Cdg, T.Progressivo, T.Filiale, DATEADD(ms, ROW_NUMBER() OVER (PARTITION BY T.Istituto, T.Cdg, T.Progressivo, T.DataInserimento ORDER BY T.Filiale) * 100, T.DataInserimento) AS NewDate
FROM (
SELECT Istituto, Cdg, Progressivo, DataInserimento, MIN(Filiale) AS MINFiliale
FROM TheTable
GROUP BY Istituto, Cdg, Progressivo, DataInserimento
HAVING COUNT(*) > 0
) AS Groups
JOIN TheTable T ON Groups.Istituto = T.Istituto AND Groups.Cdg = T.Cdg AND Groups.Progressivo = T.Progressivo AND Groups.DataInserimento = T.DataInserimento
WHERE T.Filiale <> MINFiliale
) SQ ON SQ.Istituto = ToUpdate.Istituto AND SQ.Cdg = ToUpdate.Cdg AND SQ.Progressivo = ToUpdate.Progressivo AND SQ.Filiale = ToUpdate.Filiale