繁体   English   中英

使用最大值 SQL 更新组中的所有行

[英]Updating all rows in a group with maximum value SQL

我已经研究并试图解决这个问题,但无法解决这个问题。 如果这看起来很简单,请原谅我我有一个如下数据集:-

在此处输入图像描述

我想将 Inspection_Date 和 Sl_No 列的所有行更新为 SFID 组中的最新行。

结果表应如下所示:-

在此处输入图像描述

我尝试过两种方式:-

帮助来源:-来自此sqlite 的帮助:使用第一行的值更新组中的所有行

代码 1:-

UPDATE new_copy_2 set Sl_No = (
    SELECT MAX(Sl_No) as max_date
    FROM new_copy_2 T2
    where Inspection_Type like '%PMCR%'
   and exists 
       (select 1 from new_copy_2 tt
         where tt.SFID  = T2.SFID
           and tt.Inspection_Type like '%PMCR%')

错误:-

Incorrect syntax near ')'.

帮助来源:- MySQL - 更新所有记录以匹配组中的最大值

代码 2:-

UPDATE new_copy_2
JOIN  (
        SELECT  SFID, MAX(Sl_No) AS flag
        FROM    new_copy_2
        GROUP BY
                SFID
        ) t
ON      SFID = t.SFID
SET     Sl_No = t.flag
where Inspection_Type like '%PMCR%'
   and exists 
       (select 1 from new_copy_2 tt
         where tt.SFID  = SFID
           and tt.Inspection_Type like '%PMCR%')

错误:-

Incorrect syntax near the keyword 'JOIN'.
Incorrect syntax near 't'.

请帮忙 !!

输入数据集示例

|  : Inspection_Date : | : SFID          : | Sl_No
|  : 7/4/2020        : | : SF-0000000HYD : | 8868
|  : 6/4/2020        : | : SF-0000000HYD : | 8864
|  : 3/3/2020        : | : SF-0000836659 : | 7845
|  : 3/1/2020        : | : SF-0000836659 : | 7842
|  : 4/7/2020        : | : SF-0000836432 : | 7862
|  : 4/5/2020        : | : SF-0000836432 : | 7840

预期数据集示例

|:   Inspection_Date |: SFID          |: Sl_No
|:   7/4/2020        |: SF-0000000HYD |: 8868
|:   7/4/2020        |: SF-0000000HYD |: 8868
|:   3/3/2020        |: SF-0000836659 |: 7845
|:   3/3/2020        |: SF-0000836659 |: 7845
|:   4/7/2020        |: SF-0000836432 |: 7862
|:   4/7/2020        |: SF-0000836432 |: 7862

您可以使用 window function 尝试 cte,如下所示:

 with cte as (
select *, max(sl_no)over (partition by sfid order by  Inspection_Date desc) MaxSL
from new_copy_2 )
update cte set sl_no=MaxSL
where sl_no <> maxsl;

恐怕无法更新 sql 服务器中的标识列,但您可以通过设置 identitty_insert 插入新行,然后删除现有行。 检查下面的链接。

https://stackoverflow.com/questions/19155775/how-to-update-identity-column-in-sql-server#:~:text=You%20can%20not%20update%20identity,a%20similar%20kind%20of %20 要求

您可以按如下方式使用子查询:

UPDATE new_copy_2 set Sl_No = (
    SELECT MAX(Sl_No) as max_date
    FROM new_copy_2 T2
    where sfid = T2.sfid)
   where exists 
       (select 1 from new_copy_2 tt
         where tt.SFID  = SFID)

我可以使用一种解决方法来解决它,首先提取每个 SFID 中最大 Sl_No 的行,然后将提取的表与原始表匹配。 下面是相同的代码,其中 trial_data_extract 是提取的最大行数,而 trial_data 是原始数据。

Select * into trial_data_extract from trial_data AS dat1
where Sl_No =
        ( Select MAX(Sl_No) from trial_data As dat2 where dat1.SFID =dat2.SFID)

Update trial_data 
Set Identifier = dat2.Identifier, 
    Inspection_Date = dat2.Inspection_Date 
from trial_data dat1 
Inner Join 
trial_data_extract dat2
on dat1.SFID = dat2.SFID

谢谢大家的帮助!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM