首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有SQL行的多个子句

带有SQL行的多个子句
EN

Stack Overflow用户
提问于 2022-11-17 13:14:39
回答 1查看 48关注 0票数 0

我以函数的方式实现了以下功能,但问题是我用临时表和插入实现了它。

由于我想优化代码,所以我决定尝试使用.语句。

缺点是,用as语句用SQL实现它的方式是不同的,我选择这个输出:

错误:输入第48行末尾的语法错误:...r = p_utz_begin和p_utz_end之间的p_id_var和fvr.utz );

^ SQL状态: 42601字符: 1754

这是代码:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION tlm.main_dash_tele_freq_blackout(
    p_id_unit integer,
    p_utz_begin timestamp without time zone,
    p_utz_end timestamp without time zone)
    RETURNS TABLE(can_freq interval, can_blackout interval, gps_freq interval, gps_blackout interval, chargeloss boolean) 
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
    ROWS 1000

AS $BODY$
DECLARE
     CAN_freq interval;
     CAN_blackout interval;
     CAN_chargeloss boolean;
     GPS_freq interval;
     GPS_blackout interval;
     max_diff integer;
     p_id_var integer;
    
BEGIN

p_id_var = 1001;
    
with main_dash_tele_freq_blackout_first_reading as (
    SELECT fvr.utz, fvr.val FROM var.oper_readings fvr WHERE fvr.id_unit = p_id_unit AND fvr.id_var = p_id_var AND fvr.utz BETWEEN p_utz_begin AND p_utz_end
),

main_dash_tele_freq_blackout_second_reading as ( 
    SELECT fr.utz , fr.val FROM main_dash_tele_freq_blackout_first_reading fr WHERE fr.id != 1),

 main_dash_tele_freq_blackout_result_reading as (
    SELECT ff.utz, ss.utz,  (ss.utz - ff.utz), (ss.val - ff.val) FROM main_dash_tele_freq_blackout_first_reading ff FULL JOIN main_dash_tele_freq_blackout_second_reading ss ON ff.id = ss.id
)
; 

CAN_freq = (SELECT AVG(diff) FROM main_dash_tele_freq_blackout_result_reading WHERE diff < '00:10:00');

CAN_blackout = (SELECT  AVG(diff)  FROM main_dash_tele_freq_blackout_result_reading WHERE diff > '00:10:00' AND (diff_val > 1 OR diff_val < -1));

CAN_chargeloss = (SELECT  (MAX(diff_val)>10)  FROM main_dash_tele_freq_blackout_result_reading WHERE diff > '00:10:00' AND (diff_val > 1 OR diff_val < -1));

------------------------------------------------------ Similar case for this variables ------------------------------------------------

with main_dash_tele_freq_blackout_first_GPS_reading as (
    SELECT  fvr.utz, fvr.lat, fvr.lon FROM var.oper_geo_readings fvr WHERE fvr.id_unit = p_id_unit AND fvr.utz BETWEEN p_utz_begin AND p_utz_end
),

 main_dash_tele_freq_blackout_second_GPS_reading as ( 
    SELECT fr.utz , fr.lat, fr.lon FROM main_dash_tele_freq_blackout_first_GPS_reading fr WHERE fr.id != 1
),

 main_dash_tele_freq_blackout_result_GPS_reading as (
    SELECT ff.utz, ss.utz,  (ss.utz - ff.utz), (ss.lat - ff.lat), (ss.lon - ff.lon) FROM main_dash_tele_freq_blackout_first_GPS_reading ff FULL JOIN main_dash_tele_freq_blackout_second_GPS_reading ss ON ff.id = ss.id
);

GPS_freq = (SELECT AVG(diff) FROM main_dash_tele_freq_blackout_result_GPS_reading WHERE diff < '00:10:00');

GPS_blackout = (SELECT  AVG(diff)  FROM main_dash_tele_freq_blackout_result_GPS_reading WHERE diff > '00:10:00');

RETURN QUERY (SELECT CAN_freq, CAN_blackout, GPS_freq, GPS_blackout, CAN_chargeloss );

END
$BODY$;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-17 19:13:21

您可以使用like作为这些语法:

代码语言:javascript
复制
declare variable1 integer; 
declare variable2 integer; 

with 
  tb1(a) as (
    select 1
    union all 
    select 2
    union all 
    select 3
),  
  tb2(a) as (
    select 5
    union all 
    select 10
    union all 
    select 15
)
select (select sum(tb1.a) from tb1) into variable1, (select sum(tb2.a) from tb2) into variable2;

return query 
select variable1, variable2

代码语言:javascript
复制
return query 
with 
  tb1(a) as (
    select 1
    union all 
    select 2
    union all 
    select 3
),  
  tb2(a) as (
    select 5
    union all 
    select 10
    union all 
    select 15
)
select (select sum(tb1.a) from tb1), (select sum(tb2.a) from tb2);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74476110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档