【发布时间】: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? -
基本上我在一家大公司工作,我和我自己的团队在创建或管理数据库方面都没有任何发言权,我们只是报告使用它的团队以及谁被划分为数据库我们自己来创建和维护我们自己的表。数据当然存储/转储到他们的表中。创建日期只是向下舍入的时间戳,我只是在示例中将其用作过滤器以进行简化。另外,为了澄清,我只是说所有案例都转储在同一个数据库中,以确保清楚不同的中心没有自己的数据库