如何解决比较2条记录并在POSTGRESQL中使用YES或NO更新一个新字段
我有一个要求,我们需要在POSTGRESQL中使用“ for_loop”语句, 有人可以提供CODE帮助吗?
表名nex_outages具有字段:
- 序列号
- outage_type
- outage_start_date
- last_modified_date
- 中断事件名称。
我们必须按以下顺序排序:序列号,中断类型和中断开始日期。然后将序列号的第一行与第二行的序列号进行比较。
如果两者均匹配,则将第一行outage_type与第二行outage_type进行比较,如果两者均匹配,则检查第一行outage_start_date与第二行outage_start_date之间的差异,如果差异超过61天,则设置is_duplicate字段(新字段)='第一行为“否”,并且如果outage_start_date的差值小于或等于61天,则将第一行last_modified_date与第二行last_modified_date进行比较,并且最近一次设置的last_modified_date为is_duplicate ='NO'
如果第二行last_modified_date是最近的,则将NO分配给第二行,然后在第一行和第三行之间进行下一个以上比较,然后循环。
目前我的表有50,000条记录。寻找“ FOR_LOOP”查询来实现这一目标
样本数据
|-------------------------------------------------------------------------------------------------------------------------------|
| outage_type | outage_event_name | outage_start_date | serial_number | last_modified_date | created_date
---------------------------------------------------------------------------------------------------------------------------------
| Major Inspection | 83230 | 11/1/2033 0:00 | SY0073277 | 12/21/2017 8:31 | 12/21/2017 8:31 |
| Major Inspection | 54578 | 11/1/2024 0:00 | SY0073277 | 12/23/2016 8:31 | 12/23/2016 8:31 |
| Major Inspection (MI) | 83231 | 10/30/2033 0:00 | SY0073277 | 4/12/2019 0:39 | 12/21/2017 8:31 |
| Major Inspection (MI) | 115317 | 11/1/2024 0:00 | SY0073277 | 11/8/2018 6:46 | 3/5/2018 14:58 |
| Major Inspection (MI) | 54579 | 2/3/2024 0:00 | SY0073277 | 4/11/2019 23:58 | 12/23/2016 8:31 |
| Minor Inspection | 54576 | 12/27/2029 0:00 | SY0073277 | 12/23/2016 8:31 | 12/23/2016 8:31 |
| Minor Inspection | 54577 | 12/26/2029 0:00 | SY0073277 | 4/12/2019 1:24 | 12/23/2016 8:31 |
| Minor Inspection | 83229 | 11/26/2028 0:00 | SY0073277 | 4/12/2019 0:36 | 12/21/2017 8:31 |
| Minor Inspection | 83228 | 11/21/2028 0:00 | SY0073277 | 12/21/2017 8:31 | 12/21/2017 8:31 |
| Minor Inspection | 54575 | 4/24/2019 0:00 | SY0073277 | 5/25/2019 0:31 | 12/23/2016 8:31 |
| Minor Inspection | 86703 | 4/20/2019 0:00 | SY0073277 | 4/12/2019 0:17 | 1/10/2018 19:46 |
| Minor Inspection | 54574 | 4/20/2019 0:00 | SY0073277 | 1/10/2018 16:16 | 12/23/2016 8:31 |
|-------------------------------------------------------------------------------------------------------------------------------|
预期输出:
CREATE OR REPLACE FUNCTION duplicates()
RETURNS VOID
AS $$
DECLARE
cur cursor for
Select
outage_type,outage_event_name,outage_start_date,serial_number,last_modified_date,created_date,MIN(OUTAGE_START_DATE) OVER (partition by OUTAGE_TYPE,SERIAL_NUMBER ORDER BY OUTAGE_START_DATE desc
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
as nextrecord,lead(OUTAGE_START_DATE) OVER(partition by OUTAGE_TYPE,SERIAL_NUMBER ORDER BY OUTAGE_START_DATE
desc) osd_lead,lead(last_modified_date) OVER(partition by OUTAGE_TYPE,SERIAL_NUMBER ORDER BY OUTAGE_START_DATE
desc) lmd_lead,lag(OUTAGE_START_DATE) OVER(partition by OUTAGE_TYPE,SERIAL_NUMBER ORDER BY OUTAGE_START_DATE desc)
osd_lag,lag(last_modified_date) OVER(partition by OUTAGE_TYPE,SERIAL_NUMBER ORDER BY OUTAGE_START_DATE
desc) lmd_lag,lead(outage_type) OVER(partition by OUTAGE_TYPE,SERIAL_NUMBER ORDER BY OUTAGE_START_DATE desc)
otg_typ,'NO' as is_duplicate
FROM sot_steam_da.nex_outages_src
where serial_number = 'SY0073277'
and outage_type = 'Minor Inspection'
order by outage_start_date desc,last_modified_date desc,outage_type desc;
cur_row sot_steam_da.nex_outages_src%rowtype;
BEGIN
FOR cur_row in cur
LOOP
Update sot_steam_da.nex_outages_src
set is_duplicate = if (outage_start_date::date - osd_lead::date) <= 61 and outage_type = otg_typ THEN
'No';
elseif (last_modified_date <= lmd_lead) then 'Yes';
else 'No';
end if;
END LOOP;
END;
$$
LANGUAGE plpgsql;
此代码未针对整个需求正确编码,并且上面的代码在第1条IF语句后引发语法错误,我们尝试对第1条IF记录使用上述代码中的where条件获得准确的输出。
解决方法
好的,您似乎在组合功能方面取得了合理的进步。关于UPDATE语句(尽管我不是PostgreSQL专家),我相信您的语法确实不正确。 IF子句在UPDATE / SET上下文中无效。您需要改用CASE语句,如下所示。希望这可以帮助您走得更远。
UPDATE sot_steam_da.nex_outages_src
SET is_duplicate = CASE WHEN (outage_start_date::date - osd_lead::date) <= 61
AND outage_type = otg_typ
THEN 'No'
WHEN (last_modified_date <= lmd_lead)
THEN 'Yes'
ELSE
'No'
END;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。