【发布时间】:2018-08-06 23:44:07
【问题描述】:
我有一个存储客户同意记录的表。每次状态更改时,都会创建一条新记录。我正在尝试在任何给定日期确定是否有该客户的同意。
我从一个 SUBQUERY 开始的事情是这样的:
SELECT OPT_TYPE
FROM CONSENTS C
WHERE C.DATE < '20180101'
问题是可能有多个记录符合这些条件。来自 PostgreSQL 背景,我发现 Teradata 中没有 LIMIT 1 选项很奇怪。所以,浏览我发现我可以使用 QUALIFY icw RANK 的手册。所以我尝试将查询扩展到:
SELECT OPT_TYPE
FROM CONSENTS C
WHERE C.DATE < '20180101'
QUALIFY RANK() OVER (ORDER BY C.DATE) = 1
不幸的是,这给了我一个语法错误Syntax error: Order-based Aggregate and Ordered Analytical Functions are not allowed in subqueries.。谁能告诉我如何实现这个相当简单的事情?我知道这可能是一个 Teradata 菜鸟问题,所以请放过我。
样本数据
Date Consent Account_id
20180201 Opt_out 1
20171115 Opt_in 1
20170307 Opt_out 1
我想查找在任何给定时间点最新的记录。所以如果我查询
【问题讨论】:
-
添加一些示例表数据和预期结果 - 作为格式化文本,而不是图像。
-
添加了一些示例数据。不过,这在运行普通查询时非常有效。问题是我无法在子查询中使用
QUALIFY RANK() OVER (ORDER BY C.DATE) = 1。但可能有一种更明显的方法,即基于固定排序仅选择一条记录。 -
不要在您的资格中使用排名,而是使用它来派生子查询/派生表中的列。然后您可以按该列 = 1 进行过滤。这可能会奏效,如果没有看到您的完整查询就很难说。