【问题标题】:SQL Correlated Sub Query in Join statement time constraintJoin 语句时间约束中的 SQL 相关子查询
【发布时间】:2013-12-26 06:16:55
【问题描述】:

我有一个关于 Teradata SQL 的特定问题,我确信有一个与相关子查询有关的答案...

基本上在我工作的呼叫中心,每个座席都必须为他们接听的每个电话创建一个案例(在公司 CRM 中),并且每个案例都与一个帐户相关联。我需要获取为特定日期创建的一组代理的所有案例,然后在接下来的 3 天内获取在这些帐户上创建的下一个案例(如果有)。基本上我需要采取以下 (请注意,无论创建者或帐号如何,所有案例都被转储到同一个数据库中):

SELECT
  CASES.CASE_ID, CASES.CREATION_TIMESTAMP, CASES.ACCOUNT_NUMBER, CASES.AGENT_ID
FROM
  CASES
WHERE CREATION_DATE = {d '2013-12-01'} AND AGENT_ID IN ('aaaaa','bbbbb','ccccc')

并以某种方式为每个帐户上创建的下一个案例的案例 ID 和创建时间戳添加 2 列,如下所示:

SELECT
  INITIAL_CASES.CASE_ID, INITIAL_CASES.CREATION_TIMESTAMP,
  INITIAL_CASES.ACCOUNT_NUMBER,
  INITIAL_CASES.AGENT_ID,
  REPEAT.CASE_ID, REPEAT.CREATION_TIMESTAMP
FROM
  CASES AS INITIAL_CASES
LEFT JOIN

  (SELECT
    ACCOUNT_NUMBER, MIN(CREATION_TIMESTAMP) 
   FROM CASES 
   WHERE CREATION_TIMESTAMP > INITIAL_CASES.CREATION_TIMESTAMP 
   AND CREATION_DATE >= {d '2013-12-01'} 
   AND CREATION_DATE <= {d '2013-12-04'}) REPEAT

ON INITAL_CASES.ACCOUNT_NUMBER = REPEAT_CASES.ACCOUNT_NUMBER
WHERE AGENT_ID IN ('aaaaa','bbbbb','ccccc')

一些问题是 1) 在我的代理创建他的案例后,在同一帐户上创建的案例可能没有或超过 1 个,因此我需要使用 MIN(CREATION_TS) 和 WHERE CREATION_TS > INITIAL_CREATION_TS 的组合,但是这个查询需要为我的代理案例的初始结果集中的每一行执行,因为它们都有不同的时间戳。

【问题讨论】:

  • 你的问题到底是什么?
  • ...为什么会有creation_date creation_timestamp的列?如果它们不同步,您信任哪一个?还是有一些我不知道的用途? (请注意,我不认为提取 dates 是一种有用的优化,因为它是微不足道的可推导/可查询的)另外,您为什么认为不同的创建者/帐户应该有不同的 dbs - 这是一些独特的因素到 Teradata?
  • 基本上我在一家大公司工作,我和我自己的团队在创建或管理数据库方面都没有任何发言权,我们只是报告使用它的团队以及谁被划分为数据库我们自己来创建和维护我们自己的表。数据当然存储/转储到他们的表中。创建日期只是向下舍入的时间戳,我只是在示例中将其用作过滤器以进行简化。另外,为了澄清,我只是说所有案例都转储在同一个数据库中,以确保清楚不同的中心没有自己的数据库

标签: sql teradata


【解决方案1】:

您可能不需要自联接,似乎您只需要基于 CREATION_TIMESTAMP 的下一行数据(如果它在接下来的 3 天内),并且使用 Windowed Aggregates 很容易:

SELECT
  CASES.CASE_ID, CASES.CREATION_TIMESTAMP, CASES.ACCOUNT_NUMBER, CASES.AGENT_ID,
  CASE
    WHEN MIN(CREATION_DATE)
         OVER (PARTITION BY ACCOUNT_NUMBER 
               ORDER BY CREATION_TIMESTAMP
               ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) <= DATE '2013-12-04'
    THEN MIN(CASE_ID) 
         OVER (PARTITION BY ACCOUNT_NUMBER 
               ORDER BY CREATION_TIMESTAMP
               ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS next_CASE_ID,
  CASE
    WHEN MIN(CREATION_DATE) 
         OVER (PARTITION BY ACCOUNT_NUMBER 
               ORDER BY CREATION_TIMESTAMP
               ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) <= DATE '2013-12-04'
    THEN MIN(CREATION_TIMESTAMP) 
         OVER (PARTITION BY ACCOUNT_NUMBER 
               ORDER BY CREATION_TIMESTAMP
               ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS next_CREATION_TIMESTAMP
FROM
  CASES
WHERE CREATION_DATE = {d '2013-12-01'} AND AGENT_ID IN ('aaaaa','bbbbb','ccccc')

【讨论】:

  • 优化器是否能够将所有窗口函数合并为一个,还是每次都单独调用?
  • 是的,只要 PARTITION 和 ORDER BY 相同,优化器将在一个步骤中执行多个功能。
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 2018-09-23
  • 2017-12-06
  • 2021-04-25
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
相关资源
最近更新 更多