根据另一列的筛选器更新sql列?

9wbgstp7  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(257)

我陷入了sql查询。我想使用sql查询更新列状态。确切的要求是我有一个sql表,如下所示。

_____________________________________________
start_date          end_date        status
---------------------------------------------
2014/01/03      |   2018/01/03  |   FAILED
2016/12/15      |   2017/01/03  |   SUCCESS
2014/01/03      |   2010/01/13  |   FAILED
2017/10/23      |   2017/01/03  |   FAILED
2014/01/03      |   2011/01/03  |   FAILED
2017/11/13      |   2017/01/03  |   SUCCESS
---------------------------------------------

在上表中,我有开始日期、结束日期和状态。现在我想将状态从“失败”更新为“挂起”,其中结束日期是所有日期中最早的一个,开始日期相同,但结束日期不同(此处仅更新一行,如下表所示)
我正在尝试构建查询,但无法获取所需的结果。在应用正确的查询之后,表应该如下所示。

start_date          end_date        status
---------------------------------------------
2014/01/03      |   2018/01/03  |   FAILED
2016/12/15      |   2017/01/03  |   SUCCESS
2014/01/03      |   2010/01/13  |   SUSPEND
2017/10/23      |   2017/01/03  |   FAILED
2014/01/03      |   2011/01/03  |   FAILED
2017/11/13      |   2017/01/03  |   SUCCESS
---------------------------------------------

谁能帮我一下吗。提前谢谢。

wwtsj6pe

wwtsj6pe1#

在派生表中,获取 end_date 对于一群 start_date .
加入你的主表基于 start_date 以及 min_end_date .
更新 status 相应地。
在mysql(db fiddle)中尝试以下操作:

UPDATE your_table AS t1
JOIN (SELECT start_date, 
             MIN(end_date) AS min_end_date 
      FROM your_table 
      GROUP BY start_date) AS t2 ON t2.start_date = t1.start_date AND 
                                    t2.min_end_date = t1.end_date 
SET t1.status = 'SUSPEND' 
WHERE t1.status = 'FAILED'
qgelzfjb

qgelzfjb2#

可以使用where子句来更新。我不明白你的意思,开始日期是一样的,但结束日期是不同的,所以我没有用它。

UPDATE table1
SET status='SUSPEND'
WHERE status='FAILED' and end_date<start_date
ycggw6v2

ycggw6v23#

马杜尔所说的任何逻辑都是正确的,除了一个功能性错误。既然你要的是最老的。。我们应该使用min而不是max进行查询,如下所示

UPDATE your_table AS t1
JOIN (SELECT start_date, 
             MIN(end_date) AS max_end_date 
     FROM your_table 
     GROUP BY start_date) AS t2 ON t2.start_date = t1.start_date AND 
                                    t2.max_end_date = t1.end_date  
SET t1.status = 'SUSPEND' 
WHERE t1.status = 'FAILED'

相关问题