在不使用派生 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 的查询来获取每个帐户的最新交易记录。查询应支持 Oracle
或 TERADATA
。
使用 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 与其自身连接。
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 的查询来获取每个帐户的最新交易记录。查询应支持 Oracle
或 TERADATA
。
使用 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 与其自身连接。