带子查询的红移sql查询中出现语法错误
一般来说,我是SQL新手,以前从未处理过红移。我正在尝试进行一个查询,它在postgresql中非常有效。但我在红移中得到语法错误。查询是:带子查询的红移sql查询中出现语法错误,sql,amazon-redshift,Sql,Amazon Redshift,一般来说,我是SQL新手,以前从未处理过红移。我正在尝试进行一个查询,它在postgresql中非常有效。但我在红移中得到语法错误。查询是: SELECT test.table_1.user_id as user_id, test.table_1.timestamp as start_session, test.table_1.step_3 :: timestamp + interval '1 hour' as end_session, test.table_
SELECT
test.table_1.user_id as user_id,
test.table_1.timestamp as start_session,
test.table_1.step_3 :: timestamp + interval '1 hour' as end_session,
test.table_1.step_3 :: timestamp + interval '1 hour' - test.table_1.timestamp :: timestamp as session_duration
FROM (SELECT *,
min(case when page = 'second_page' then timestamp end) OVER (partition by user_id order by timestamp desc rows between unbounded preceding and unbounded following) as step_2,
min(case when page = 'third_page' then timestamp end) OVER (partition by user_id order by timestamp desc rows between unbounded preceding and unbounded following) as step_3
FROM test.table_1) test.table_1
WHERE
test.table_1.page = 'first_page' AND
step_2 > test.table_1.timestamp AND
step_3 > step_2 AND
step_3 :: timestamp - step_2 :: timestamp < '1 hour' AND
step_2 :: timestamp - test.table_1.timestamp :: timestamp < '1 hour'
ORDER BY
user_id,start_session
运行查询时出错:语法错误位于或接近。第11行:来自test.vimbox_页面test.vimbox_页面^来自test.table_1 test.table_1
我不明白那里怎么了。
通过这个查询,我试图以某种顺序获取用户在阅读页面时的操作会话列表。
我会感谢你的帮助 别名是标识符,需要遵循标识符规则。您还可以通过其他方式简化查询:
SELECT t.user_id, t.timestamp as start_session,
(t.step_3::timestamp + interval '1 hour' as end_session),
(t.step_3::timestamp + interval '1 hour' - t.timestamp::timestamp) as session_duration
FROM (SELECT t.*,
MIN(CASE WHEN page = 'second_page' THEN timestamp END) OVER (PARTITION BY user_id) as step_2,
MIN(CASE WHEN page = 'third_page' THEN timestamp END) OVER (partition by user_id) as step_3
FROM test.table_1 t
) t
WHERE t.page = 'first_page' AND
step_2 > t.timestamp AND
step_3 > step_2 AND
step_3::timestamp < step_2::timestamp + interval '1 hour' AND
step_2::timestamp < timestamp + interval '1 hour'
ORDER BY user_id, start_session;
注:
您的windowing子句过于复杂。如果需要整个窗口范围,则不需要“按订单”。
考虑到列的名称,应该不需要转换为时间戳。但我把它们留在了家里。
t、 用户id作为用户id是冗余的。无论如何,列名都将是user\u id。
我从来没有在……周围看到过空格。当然,它们是允许的,但是类型转换具有非常高的优先级,并且通常不带空格。
与时间戳相比,我更喜欢时间戳比较,而不是转换为时间间隔。奇怪的事情有时会发生。
将子查询的别名从test.table_1更改为类似t1的名称,并在查询中使用它。文档没有明确说明它也适用于别名,但我想别名命名应该遵循相同的规则:它说:不包含引号和空格。