加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

如何为每个帐户的上次交易进行SQL查询?

发布时间:2020-12-12 08:48:44 所属栏目:MsSql教程 来源:网络整理
导读:说我有一个表“事务”,其列有“acct_id”“trans_date”和“trans_type”,我想过滤这个表,以便我只有每个帐户的最后一个事务.显然我可以做一些事情 SELECT acct_id,max(trans_date) as trans_date FROM transactions GROUP BY acct_id; 但是我失去了我的trans
说我有一个表“事务”,其列有“acct_id”“trans_date”和“trans_type”,我想过滤这个表,以便我只有每个帐户的最后一个事务.显然我可以做一些事情
SELECT acct_id,max(trans_date) as trans_date  
FROM transactions GROUP BY acct_id;

但是我失去了我的trans_type.然后我可以使用我的日期列表和帐户ID进行第二次SQL调用,并获取我的trans_type,但是感觉非常cludgy,因为它意味着来回发送到sql server或者意味着创建一个临时表.

有一种方法可以使用单个查询来执行此操作,希望能够与mysql,postgres,sql-server和oracle一起工作的通用方法.

解决方法

这是一个 greatest-n-per-group查询的例子.这个问题在StackOverflow上每周出现几次.除了其他人提供的子查询解决方案之外,这里是我的首选解决方案,它不使用子查询GROUP BY或CTE:
SELECT t1.*
FROM transactions t1
LEFT OUTER JOIN transactions t2
  ON (t1.acct_id = t2.acct_id AND t1.trans_date < t2.trans_date)
WHERE t2.acct_id IS NULL;

换句话说,返回一行,使得没有其他行存在相同的acct_id和更大的trans_date.

此解决方案假设trans_date对于给定的帐户是唯一的,否则可能会发生关系,并且查询将返回所有绑定的行.但是对于其他人提供的所有解决方案也是如此.

我更喜欢这个解决方案,因为我经常在MySQL上工作,这不利于GROUP BY.所以这种外连接解决方??案通常被证明是更好的性能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读