sql - 一种更优雅的聚合列的方式

标签 sql sql-server sql-server-2005 tsql

这是一个简化的交易表。

每一行都是一个交易,它有一个唯一的交易 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/

相关文章:

mysql - 一个表中的两列是否可以具有指向另一个表中同一列的外键?

python - PyODBC 从简单的 SELECT 子句获取结果

sql - 如何查找按日期排序且包含特定值的连续两行?

sql-server-2005 - 为什么 Microsoft SQL Server 在 CREATE 语句失败时隐式回滚?

java - 什么(com.microsoft.sqlserver.jdbc.SQLServerException :The index 0 is out of range )exception means

mysql - 执行 "global"GROUP BY 存储为 `field1` , `field2` 的字段的最佳方法

sql - 是否可以使用某种组查询对列中的数字进行分组?

MySql 在逗号分隔的集合中找到一个值

SQL 从 3 个表中选择数据

sql-server - 使用 SQL "Messages" Pane 的结果