【问题标题】:How to select latest record out of a few potential found, in a Subquery如何在子查询中从找到的几个潜在记录中选择最新记录
【发布时间】: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 进行过滤。这可能会奏效,如果没有看到您的完整查询就很难说。

标签: sql teradata


【解决方案1】:

一种方法是:

select c.*
from consents c
where c.date = (select max(c2.date)
                from consents c2
                where c2.date < '20180101'
               );

在更新的版本中,您可以这样做:

SELECT TOP (1) OPT_TYPE
FROM CONSENTS C
WHERE C.DATE < '20180101'
ORDER BY C.DATE DESC;

【讨论】:

    【解决方案2】:

    子查询中不允许使用 TOP 和 OLAP 函数,因为它可能是相关子查询。

    作为解决方法,您可以将其重写为连接或将其嵌套在派生表中:

    select ...
    from mytable join
     (
       SELECT OPT_TYPE
       FROM CONSENTS C
       WHERE C.DATE < '20180101'
       QUALIFY RANK() OVER (ORDER BY C.DATE) = 1
     ) as dt
    on ... 
    
    select ...
    from ...
    where OPT_TYPE in
     ( 
       SELECT *
       FROM
        (
          SELECT OPT_TYPE
          FROM CONSENTS C
          WHERE C.DATE < '20180101'
          QUALIFY RANK() OVER (ORDER BY C.DATE) = 1
        ) as dt
     ) 
    

    顺便说一句,如果您的日期列实际上是一个日期,您应该使用 日期文字 DATE '2018-01-01' 而不是字符串 '20180101'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 2021-05-16
      • 2012-12-10
      • 2013-09-12
      相关资源
      最近更新 更多