查找每个工作日每个room_id的最长连续时间

时间:2020-05-19 13:25:12

标签: sql postgresql plpgsql recursive-query

我试图找到每个工作日每个room_id的最长连续时间。我想将工作日转换为其整数表示形式(0代表星期日,1代表星期一,等等)。

到目前为止我所拥有的:

 requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(
   WindowManager.LayoutParams.FLAG_FULLSCREEN,
   WindowManager.LayoutParams.FLAG_FULLSCREEN
);

但我收到此错误:

create or replace function iweekday(weekday  varchar(9))
returns int as $$
DECLARE iw INT;
begin
select  iw= CASE weekday
                        WHEN 'Monday' THEN 1
                        WHEN 'Tuesday' THEN 2
                        WHEN 'Wednesday' THEN 3
                        WHEN 'Thursday' THEN 4
                        WHEN 'Friday' THEN 5
                        WHEN 'Saturday' THEN 6  
                        WHEN 'Sunday' THEN 0
                    END;
end;
$$ language plpgsql;


create or replace function fourpointnine()
returns table (room_id character(7), iw int, start_time int,end_time int) as $$
DECLARE iw INT;
begin
with recursive cte as(
    select  l.room_id, l.weekday, l.start_time, l.end_time
    from "learningactivity" l
    union all 
    select l.room_id, l.weekday, cte.start_time, l.end_time
    from cte join "learningactivity" l on l.room_id=cte.room_id and l.weekday=cte.weekday and cte.end_time=l.start_time
),  cte2 as(
    select *,  row_number() over (partition by cte.room_id  order by EXTRACT(EPOCH FROM cte.end_time - cte.start_time)/3600 desc ) as rn
    from cte
)


select distinct cte2.room_id, iweekday(cte2.weekday), cte2.start_time, cte2.end_time
from cte2
where rn=1
group by cte2.room_id, iweekday(cte2.weekday), cte2.start_time, cte2.end_time;
end;
$$ language plpgsql;

如何正确执行?

1 个答案:

答案 0 :(得分:1)

可以使用smtpjs修复即时错误。参见:

但是不要打扰,从一开始,PL / pgSQL函数就显得过于刻板。

您的帮助器功能 更加简单和便宜:

RETURN QUERY

({CREATE OR REPLACE FUNCTION iweekday(weekday text) RETURNS int LANGUAGE sql IMMUTABLE PARALLEL SAFE AS $func$ SELECT CASE weekday WHEN 'Monday' THEN 1 WHEN 'Tuesday' THEN 2 WHEN 'Wednesday' THEN 3 WHEN 'Thursday' THEN 4 WHEN 'Friday' THEN 5 WHEN 'Saturday' THEN 6 WHEN 'Sunday' THEN 0 END $func$; 仅适用于Postgres 9.6或更高版本。)

最重要的是,它可以是inlined。相关:

您的主要功能可以替换为以下查询:

PARALLEL SAFE

如果您坚持使用功能:

WITH RECURSIVE cte AS (
   SELECT l.room_id, l.weekday, l.start_time, l.end_time
   FROM   learningactivity l

   UNION ALL 
   SELECT l.room_id, l.weekday, c.start_time, l.end_time
   FROM   cte c
   JOIN   learningactivity l ON l.room_id = c.room_id
                            AND l.weekday = c.weekday
                            AND l.start_time = c.end_time
  )
SELECT DISTINCT ON (1, 2)
       c.room_id, iweekday(c.weekday) AS iw, c.start_time, c.end_time
FROM   cte c
ORDER  BY 1, 2, c.start_time - c.end_time;

db <>提琴here

相关:

此外:永远不要使用数据类型CREATE OR REPLACE FUNCTION fourpointnine() RETURNS TABLE (room_id text, iw int, start_time int, end_time int) LANGUAGE sql AS $func$ -- paste query from above $func$; 。参见: