使用最大值 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 <> 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 更新组中的所有行的主要内容,如果未能解决你的问题,请参考以下文章