我试图找到每个工作日每个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;
如何正确执行?
答案 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$;
。参见: