2016-11-30 81 views
0
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 

我需要一个不使用派生表的查询来获取每个帐户具有最新事务的记录。查询应支持OracleTERADATA。 使用派生表我能够如下解决这个问题:未使用派生表的每个组的排名

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; 

感谢您的帮助!

回答

1

为什么不派生表?

在Teradata数据还有的出线,但它是没有标准的SQL:

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

在Oracle中,你需要派生表:

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 
-1

尝试此查询:

SELECT [交易时间],[帐户名称],

铅([交易时间],1,1)OVER(ORDER BY [帐户名称])

FROM [DBO]。[acct_details]

这会帮助你

+0

这不回答OP的问题。 OP正在查找每个帐号最大transaction_time的行。您的查询甚至不会查找每个帐号的下一个交易时间,更不用说在交易时间内订购!那么所有的方括号是什么? – Boneist

+0

@Boneist:这是微软的污染,所有那些方括号和等同'SQL' ='MS SQL' :-) – dnoeth

+0

@Boneist:跟随方括号是错误的,我只是跟着数据库中它们是如何。 –

0

你可以使用像这样的内联视图:

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上运行。

我在这里假设,当你说你想避免派生表时,你的意思是你想避免将表加入自己。

+0

两个具有相同的别名“a”?你确定??这应该会给出错误。 – TechBytes

+0

*内联视图* = *派生表* – dnoeth

+0

@TechBytes哎呀,我忘了在发布我的答案之前从from子句中删除表。我已经删除它 - 谢谢! – Boneist

相关问题