postgresql - 有人可以帮我把它翻译成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 课程中花费的时间。
解决方案
我假设原始查询是为 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%%
推荐阅读
- c# - WPF 自定义用户界面未出现在
- python - pytest 如何模拟 s3fs.S3FileSystem 打开文件
- javascript - 如何过滤数组并使用特定对象键创建新数组
- sql - 用 Union 语句中的值计算
- java - javax.net.ssl.SSLProtocolException:证书链长度 (11) 超过了允许的最大长度 (10)
- typo3 - TYPO3:在后端禁用语言标签
- haskell - 在 Cabal 中将内部模块暴露给测试
- r - 如何识别连续 5 次涨价的序列?
- c# - 如何在 Entity Framework 6 中加入 2 个实体以获取翻译文本
- discord.py - 如何让 Discord Bot 回复特定消息,而不是回复包含单词的每条消息