带子查询的红移sql查询中出现语法错误

带子查询的红移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_

一般来说,我是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_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的名称,并在查询中使用它。文档没有明确说明它也适用于别名,但我想别名命名应该遵循相同的规则:它说:不包含引号和空格。