2017-10-05 43 views
1

我有几个表,我加入到一个表,看起来像这样:加1到行满足certian复杂的标准

Date       Amount  pKey kID Source 
10/4/2017 11:00:01 AM  49.34   27  81  TT 
10/4/2017 10:49:29 AM  23.11   26  89  TT 
10/4/2017 11:45:20 AM  54.14   24  42  G 
10/4/2017 2:20:10 PM  10.20   26  89  G 

数据进入在不同的时间,每天的源表。我想要做的是创建一个程序或一些可以“移动”某些行的东西。如果TT行在当天的最后G行之后进入,我想将TT行移动到第二天(但只有当它具有与最后G行相同的pKey和kID时)。因此,在上述情况下,我想取第4行,并将日期重置为10/5/2017 XX:XX:XX,因为它在第2行后面 - 它具有相同的pKey和kID。

我意识到“最后”和“之后”是相对的结构,但希望它是有道理的。

我该如何实现这个目标。请注意[Date]以字符串形式出现,因此可能需要进行转换。

+0

使用适当的软件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服务器2014'。语法和功能的差异往往会影响答案。请注意,'tsql'缩小了选择范围,但不指定数据库。 – HABO

回答

1

我想这你想要做什么:

update t 
    set date = dateadd(day, 1, date) 
    where t.source = 'TT' and 
      t.date < (select max(t2.date) 
        from t t2 
        where t2.pkey = t.pkey and t2.kid = t.kid and 
          t2.source = 'G' and 
          cast(t.date as date) = cast(t2.date as date) 
        ); 

这是一个很值得你的逻辑的直接转换。

+0

我认为可能存在别名问题。我用我的表名dbo.Volumes替换了“t”,它运行了,但没有影响行,我知道有几行满足条件。我尝试在where子句中运行select语句,并且它说t.pkey,t.kid和t.date列不能被绑定...(这是假设预期的),您确定别名是正确的吗? – james5

+0

更新:啊,使用where子句运行select语句,它没有出现行,看起来像我需要做一些调查我的结果。也许我解释了错误的标准 – james5