[英]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 插入新行,然后删除现有行。 检查下面的链接。
您可以按如下方式使用子查询:
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.