sql - Teradata 中的 "First order by"

标签 sql oracle teradata row-number

我在将 SQL 语句从 Oracle 转换为 Teradata 时遇到问题。 Oracle中的说法是:

SELECT ar.account_no,
MAX (ah.bal_acct) KEEP (DENSE_RANK FIRST ORDER BY ah.created_t desc) 
FROM ar
   JOIN ah ON ah.obj_id0 = ar.poid_Id0
   JOIN acc ON a.poid_id0 = ar.account_obj_Id0
WHERE acc.account_no = '1234'
AND ah.created_t <= 1434753495
GROUP BY ar.account_no

我需要在 Teradata 中执行类似的语句。我尝试了一些东西

QUALIFY ROW_NUMBER() OVER( PARTITION BY max(ah.bal_acct) ORDER BY ah.created_t desc) = 1

但我总是遇到错误:选定的非聚合值必须是关联组的一部分。

这就是我得到的:

Select ar.account_no, ah.created_t, ah.bal_acct
FROM VD_REPLICA_BRM.pi_tp_acct_ar_t ar
    JOIN VD_REPLICA_BRM.pi_tp_acct_ar_hist_T ah ON ah.obj_id0 = ar.poid_Id0
    JOIN VD_REPLICA_BRM.pi_account_t acc ON acc.poid_id0 = ar.account_obj_Id0
WHERE acc.account_no = '00003095660515'
    AND ah.created_t <= CAST('2016-10-31' AS DATE FORMAT 'YYYY-MM-DD')
QUALIFY ROW_NUMBER() OVER( PARTITION BY max(ah.bal_acct) ORDER BY ah.created_t desc) = 1
GROUP BY ar.account_no

我哪里做错了?

最佳答案

我不确定您是否可以使用 qualify 来做到这一点。等效的语句是:

SELECT ar.account_no, ah.created_t, ah.bal_acct
FROM (SELECT ar.account_no, ah.created_t, ah.bal_acct,
             ROW_NUMBER() OVER (PARTITION BY ar.account_no ORDER BY ah.created_t DESC) as seqnum
      FROM ar JOIN
           ah
           ON ah.obj_id0 = ar.poid_Id0 JOIN
           acc
           ON a.poid_id0 = ar.account_obj_Id0
      WHERE acc.account_no = '1234' AND ah.created_t <= 1434753495
     ) t
WHERE seqnum = 1;

呃。您可以使用QUALIFY来做到这一点。问题是GROUP BY:

SELECT ar.account_no, ah.created_t, ah.bal_acct
FROM VD_REPLICA_BRM.pi_tp_acct_ar_t ar JOIN
     VD_REPLICA_BRM.pi_tp_acct_ar_hist_T ah
     ON ah.obj_id0 = ar.poid_Id0 JOIN
     VD_REPLICA_BRM.pi_account_t acc
     ON acc.poid_id0 = ar.account_obj_Id0
WHERE acc.account_no = '00003095660515' AND
      ah.created_t <= CAST('2016-10-31' AS DATE FORMAT 'YYYY-MM-DD')
QUALIFY ROW_NUMBER() OVER( PARTITION BY ar_account_no ORDER BY ah.created_t desc) = 1

关于sql - Teradata 中的 "First order by",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40846755/

相关文章:

python - 如何在 SMALLINT 上使用 teradatasql 在数据库中插入空值,计算期间发生数字溢出

sql - 分组依据 : shorthand

sql - 什么是亲子关系?

php - 获取在 phpmyadmin 上工作的 Microsoft Server 2008 sql 查询

c# - 不支持 Linq-to-EF DateTime.ToLocalTime

sql - 左连接和左外连接有什么区别?

mysql - 如何用随机字符串替换一列所有记录?

使用指定主机名的 ocilib 连接 Oracle

sql - 关于 SQL 数据透视查询

sql - 从选择插入 (Teradata)