列之间的SQL交换值

时间:2019-03-06 11:26:01

标签: sql vertica

由于导入错误,我有这种奇怪的情况。

假设一个表:

date         feat1   feat2
2019-01-01      a      z
2019-01-01      a      z
2019-01-03      z      a
2019-01-04      z      a
2019-01-05      z      a

从更新日期开始,我们交换了feat1中的值和列feat2中的值。 结果我正在寻找

date         feat1   feat2
2019-01-01      a      z
2019-01-01      a      z
2019-01-03      a      z
2019-01-04      a      z
2019-01-05      a      z

如何在不创建临时列的情况下通过一条更新语句解决此问题?我正在使用Vertica DB

2 个答案:

答案 0 :(得分:5)

类似的事情在TSQL中可行,您可以将其用作基础:

UPDATE tbl SET feat1 = feat2, feat2 = feat1 WHERE date >= 'YYYY-MM-DD'

答案 1 :(得分:0)

为什么不只是做这样的事情?

update t
    set feat1 = t1.feat1,
        feat2 = t1.feat2
    from (select t.*
          from t
          order by t.date
          limit 1
         ) t1
    where t.feat1 <> t1.feat1 or t1.feat2 <> t1.feat2;

这不需要知道“魔术日期”或特定值。如果值可以为NULL,则您希望通过比较逻辑将其考虑在内。

如果您只想查询select,则first_value()会执行您想要的操作:

select t.date,
       first_value(t.feat1) over (order by t.date) as feat1,
       first_value(t.feat2) over (order by t.date) as feat1
from t;