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

Posted

技术标签:

【中文标题】使用最大值 SQL 更新组中的所有行【英文标题】:Updating all rows in a group with maximum value SQL 【发布时间】:2021-02-03 11:03:18 【问题描述】:

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

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

生成的表格应如下所示:-

我尝试过两种方式:-

帮助来源:-来自sqlite: update all rows in group with value from first row的帮助

代码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 - updating all records to match max value in group

代码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

【问题讨论】:

如果可以,请分享表结构和一些示例数据。 我已经包含了输入表和所需的结果数据表 这些是图片。如果您可以提供一些文本格式的数据,我本可以在回答之前验证查询。这就是我问的原因。 @ Kazi :- 我已经添加了输入数据集和预期结果数据集的样本。请看一下 【参考方案1】:

您可以尝试 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 server 中的标识列,但您可以通过设置 identitty_insert 来插入新行,然后删除现有行。检查以下链接。

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

【讨论】:

我还要添加where sl_no &lt;&gt; max_sl。当 SQL Server 不更新没有更改的行时,它的效率更高。 错误:- 无法更新标识列“Sl_No”。 @r_sh_07 。 . .您的问题是关于更新该列。如果是身份,那你就不行了。 最高序列号的检验日期也总是一组中最高的,最高序列号总是有最晚的日期。我们不能将两者都用作彼此的身份列吗??【参考方案2】:

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

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)

【讨论】:

:- 它说无法更新身份列“Sl_No”。 :- 使用这个也是同样的错误 无法更新标识列 'Sl_No'。 同样的错误:- 无法更新身份列 'Sl_No'。【参考方案3】:

我可以使用一种解决方法来解决它,首先提取每个 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

谢谢大家的帮助!!

【讨论】:

以上是关于使用最大值 SQL 更新组中的所有行的主要内容,如果未能解决你的问题,请参考以下文章

从Oracle SQL中的每个组中选择具有最大值的行[重复]

sql 分组后求每组中的最大值对应的那条数据

在python中查找多个组中的最大值

哪个是解决子组中最大值的最佳标准 sql 查询

SqlServer函数的聚合函数

Oracle SQL:从组中选择最大值和最小值