【问题标题】:redshift subquery reference issue - self join and minredshift 子查询参考问题 - 自联接和最小
【发布时间】:2017-04-28 08:19:28
【问题描述】:

我有一个在标准 sql 上运行良好的查询,但 redshift 的限制不允许在内部选择中引用外部查询信息的查询。

查询的基本思想是为该客户上次发布响应的时间戳生成差异。我有来自论坛的客户发布时间戳,我想知道他们何时发布,自他们上次发布以来的时间差异是多少。这是在 sql 中对测试数据运行的查询,预期输出:http://sqlfiddle.com/#!9/04358/2

这是查询:

SELECT
  current.id,
  current.datetime,
  TIMESTAMPDIFF(minute, current.datetime, IFNULL(next.datetime, 
current.datetime)) as diff
FROM
  TestTable as current
LEFT JOIN
  TestTable as next
    on next.datetime = (select min(datetime) from TestTable
      where datetime > current.datetime and id = current.id)
order by
  current.id, current.datetime

在 redshift 中,这不起作用,因为不支持子查询模式。任何想法如何将其变成非参考子查询?

【问题讨论】:

    标签: sql amazon-redshift


    【解决方案1】:

    您不需要派生表。使用窗口函数first_value获取一个id最后一次发表评论的时间,并将其用于减法。

    SELECT
    id,
    datetime,
    DATEDIFF(minute, datetime, first_value(datetime) over(partition by id order by datetime desc rows between unbounded preceding and unbounded following)) as diff
    FROM TestTable 
    

    我不确定窗口函数是否在 Redshift 中的另一个函数中工作。在这种情况下尝试,

    SELECT
    id,
    datetime,
    DATEDIFF(minute, datetime, last_response_time) as diff
    FROM (SELECT t.*,first_value(datetime) over(partition by id order by datetime desc rows between unbounded preceding and unbounded following) as last_response_time
          FROM TestTable t
         ) t
    

    【讨论】:

    • 谢谢。这会容易得多。此行某处存在语法错误,现在尝试解决。
    • 仍然在摆弄正确的语法,不知道出了什么问题,但这是您查询的更新,您会看到语法错误:sqlfiddle.com/#!9/04358/13
    • 这个语法不适用于mysql。你没有使用redshift吗?
    • 你说得对,我使用的是redshift,它们在语法上重叠但不一样。我仍然在 redshift 中遇到语法错误,这就是我提到它的原因。还没弄清楚为什么。我在 redshift 上运行上面的代码(使用 datediff 而不是 timestampdiff 来实现 redshift 功能)并得到这个错误: Error running query: The query was malformed: (u'ERROR', u'42601', u'syntax error at or靠近“BETWEEN”', u'363',...
    • 我也不确定。可能是版本问题或我这边的其他问题。无论如何,感谢您向我指出这个方向,远离自联接,我最终使用 LEAD 和 OVER 进行分区并使其正常工作: LEAD(datetime, 1) OVER (partition by id order by datetime) as datetime_next跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多