#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%%