Может кто-нибудь помочь мне перевести это на postgresql?

#postgresql

#postgresql

Вопрос:

Я очень новичок в SQL и не очень разбираюсь в написании кода в разных СУБД. Я пытаюсь написать отчет на платформе 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.

Комментарии:

1. В SQL «программа» состоит из одного оператора. Там нет переменных или назначений. Нет процедурного потока обработки и выполнения. Вы более или менее описываете желаемый результат, и пусть база данных сделает все остальное.

Ответ №1:

Я предполагаю, что исходный запрос был написан для 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%%