首页 > 解决方案 > 有人可以帮我把它翻译成postgresql吗?

问题描述

我对 SQL 很陌生,对在不同的 DBMS 中编写代码知之甚少。我正在尝试在我们学校的 MOODLE 平台上编写一份报告,该平台使用 postgresql,使用此处找到的可配置报告。但是,该代码在 postgresql 中不起作用。特别是,我如何用变量赋值重写那些行,比如@prevtime :=让代码在 postgresql 中工作?

这是链接中的完整代码。

SELECT 
l.id, 
l.timecreated, 
DATE_FORMAT(FROM_UNIXTIME(l.timecreated),'%d-%m-%Y') AS dTime,
@prevtime := (SELECT MAX(timecreated) FROM mdl_logstore_standard_log 
        WHERE userid = %%USERID%% AND id < l.id ORDER BY id ASC LIMIT 1) AS prev_time,
IF (l.timecreated - @prevtime < 7200, @delta := @delta + (l.timecreated-@prevtime),0) AS sumtime,
l.timecreated-@prevtime AS delta,
"User" AS TYPE
 
FROM prefix_logstore_standard_log AS l, 
(SELECT @delta := 0) AS s_init 
# CHANGE UserID
WHERE l.userid = %%USERID%% AND l.courseid = %%COURSEID%%
%%FILTER_STARTTIME:l.timecreated:>%% %%FILTER_ENDTIME:l.timecreated:<%%

这应该报告学生在 MOODLE 课程中花费的时间。

标签: postgresql

解决方案


我假设原始查询是为 MySQL 编写的。您还没有解释查询的实际作用,但@prevtime黑客通常是缺少窗口函数的解决方法,所以很可能这可以lag()在 Postgres 中使用,类似以下内容:

select l.id, 
       l.timecreated, 
       to_char(to_timestamp(l.timecreated), 'dd-mm-yyyy') as dtime, 
       lag(timecreated) over w as prev_time,
       l.timecreated - lag(timecreated) over w as delta,
       'User' as type,
FROM prefix_logstore_standard_log AS l
window w as (partition by userid order by id) 
WHERE l.userid = %%USERID%% 
  AND l.courseid = %%COURSEID%%

推荐阅读