在不使用派生 table 的情况下对每个组进行排名

Rank on each group without using derived table

AccountNo           Account Name         Transaction time             Transaction Amount
A01                 Name 1               01-01-2016 04:00:00          5000
A01                 Name 1               01-01-2016 07:30:00          3500
A01                 Name 1               01-01-2016 09:30:00          3500
A01                 Name 1               01-01-2016 12:00:00          6500
A01                 Name 1               02-02-2016 06:00:00          4000
A01                 Name 1               01-02-2016 08:30:00          8000
A01                 Name 1               01-02-2016 09:30:00          8000
A02                 Name 2               05-01-2016 04:00:00          2000
A02                 Name 2               05-01-2016 07:30:00          8500
A02                 Name 2               08-02-2016 06:00:00          1000
A02                 Name 2               09-02-2016 08:30:00          9000

我需要一个不使用派生 table 的查询来获取每个帐户的最新交易记录。查询应支持 OracleTERADATA。 使用 Derived table 我可以按如下方式解决它:

SELECT a.accountno, 
       a.account_name, 
       a.transaction_time, 
       a.transaction_amount 
FROM   acct_details a, 
       (SELECT accountno, 
               Max(transaction_time) AS Transaction_time 
        FROM   acct_details 
        GROUP  BY accountno) b 
WHERE  a.accountno = b.accountno 
   AND a.transaction_time = b.transaction_time;

感谢帮助!!

试试这个查询:

SELECT[交易时间],[账户名],

lead([交易时间],1,1) OVER (ORDER BY [账户名])

来自 [dbo].[acct_details]

这应该对你有帮助

为什么没有 Derived Table?

Teradata 中有 QUALIFY,但不是标准 SQL:

SELECT *
FROM   acct_details 
QUALIFY RANK() OVER (PARTITION BY accountno 
                     ORDER BY transaction_time DESC) = 1;

在 Oracle 中你需要一个 Derived Table:

SELECT a.accountno, 
       a.account_name, 
       a.transaction_time, 
       a.transaction_amount,
FROM
 ( 
    SELECT a.accountno, 
           a.account_name, 
           a.transaction_time, 
           a.transaction_amount,
           RANK() OVER (PARTITION BY accountno 
                        ORDER BY transaction_time DESC) as rnk
    FROM   acct_details a
 ) a
WHERE rnk = 1

您也可以尝试 Oracle 的 MAX/KEEP:

SELECT a.accountno, 
       MAX (a.account_name) KEEP (DENSE_RANK FIRST ORDER BY a.transaction_time desc) , 
       MAX(a.transaction_time), 
       MAX (a.transaction_amount) KEEP (DENSE_RANK FIRST ORDER BY a.transaction_time desc)     FROM  acct_details a
GROUP BY a.accountno

您可以像这样使用内联视图来做到这一点:

SELECT a.accountno, 
       a.account_name, 
       a.transaction_time, 
       a.transaction_amount 
FROM   (SELECT accountno, 
               account_name, 
               transaction_time, 
               transaction_amount, 
               Max(transaction_time) OVER (PARTITION BY accountno) AS max_transaction_time 
        FROM   acct_details) a
WHERE  a.transaction_time = a.max_transaction_time;

这适用于 Oracle,我认为它也适用于 Teradata。

我在这里假设当你说你想避免派生 table 时,你的意思是你想避免将 table 与其自身连接。