SQL列之间的交换值

问题描述 投票:0回答:2

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

假设一张表:

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

从certian日期开始,我们有来自feat1feat2列交换的值。结果我正在寻找

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

sql vertica
2个回答
5
投票

这样的东西可以在TSQL中使用,你可以用它作为基础:

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

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;
© www.soinside.com 2019 - 2024. All rights reserved.