这是一个简化的交易表。
每一行都是一个交易,它有一个唯一的交易 ID(如果你愿意,可以是身份字段)、一个账户指针(这里没有显示的账户表的外键)、一个交易日期和一个美元金额。
示例数据如下:
trans_id acc_ptr trans_date amount
1 12 2011-08-24 2.0
2 12 2011-08-25 3.0
3 14 2011-07-28 -3.0
4 16 2011-06-14 -1.0
5 12 2011-05-15 0.5
6 16 2011-07-30 -2
我想要的很简单。显示按 acc_ptr 分组的最新交易,包括该日期的金额。
我的工作非常完美,但我想知道的是,是否有更优雅的方式(就编程而言)或更有效的方式来处理这个问题,特别是我对金额子查询的处理?想看看你会如何处理它。
我的方法:
select acc_ptr
, max(trans_date) as [most rec transac date]
, (select amount from transactions t2
where t2.trans_date = max(t1.trans_date)
and t2.acc_ptr = t1.acc_ptr) as amount
from transactions t1
group by acc_ptr
最佳答案
第一个想到的替代方案是使用分析(即:ROW_NUMBER),但那是 SQL Server 2005+ 的功能。
WITH example AS (
SELECT t.acc_ptr,
t.trans_date AS [most rec transac date],
t.amount,
ROW_NUMBER() OVER (PARTITION BY t.acc_ptr
ORDER BY t.trans_date DESC) AS rnk
FROM transactions t)
SELECT e.acc_tpr,
e.trans_date,
e.amount
FROM example e
WHERE e.rnk = 1
此示例中使用 CTE(WITH
语法)没有性能值(value) - 这是等效的:
SELECT e.acc_tpr,
e.trans_date,
e.amount
FROM (SELECT t.acc_ptr,
t.trans_date AS [most rec transac date],
t.amount,
ROW_NUMBER() OVER (PARTITION BY t.acc_ptr
ORDER BY t.trans_date DESC) AS rnk
FROM transactions t) e
WHERE e.rnk = 1
关于sql - 一种更优雅的聚合列的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7251984/