sql使用聚合函数之后,怎么获取得到的该条记录?

比如:

userid      date        money
  1       '2015-6-30'   500
  2       '2015-7-30'   100
  2       '2015-8-30'   100
  1       '2015-5-30'   500
  3       '2015-8-30'   900
  2       '2015-9-30'   100
  1       '2015-3-30'   400
  

使用聚合函数 MAX(date) 得到最晚的时间.
但是如果要获取userid和money的话就需要分组,不然数据会不准确(这点我测过),但是会出现多条数据.
如何才能得所有不同的userid最晚的这条记录,得到这样的:

userid      date        money
 1        '2015-6-30'    500
 2        '2015-9-30'    100
 3        '2015-8-30'    900
阅读 5.9k
3 个回答

理论上来说,你这个需求是不合理的(或是不完全的)

你可能是想得到:

  • 最后一天的userid和money。那最后一天可能会有多个userid和money?
    这样的方案就是:

select userid, date, money
from your_table_name
where date = (select max(date) from your_table_name)

如果你的数据中,每一天只会有一个userid和money,其实这样出来就是一条数据了。

  • 你的需求也可能是,找出当天最后一笔。。。你的date只是日期吗?是否包含了时间?如果没有时间,表中是否有其它字段可以反映先后顺序的?假设你的date中是有时间的。。。那么,找出最后一笔(通常,量不是很大的情况下,时间一般不会相同),就不需要聚合函数,只要用排序就好了。

--for mysql
select userid, `date`, `money`
from your_table_name
order by `date` desc
limit 1

--for ms sql server,碰到语法错误可能会是字段与关键字重复,可以加上[]
select top 1 userid, [date], [money]
from your_table_name
order by [date] desc

--其它数据库限制结果集的方法可以自己baidu
  • 其实这样还是有问题。。。如果你的date只包括日期,每天又有多笔,而你又真的只想显示一笔。比如这样的数据:

userid    date         money
1         '2015-1-1'     330.00
2         '2015-1-1'     660.00

依这样的数据,你用方法2出来的可能是随机的一条,除非你加上order by userid...碰到同一userid同一天有多条,无解了。

所以,这时候,你需要考虑修改你的表结构。比如增加一个序号字段,可以是数据库的自增、或是按日期+流水号。

先这些吧。期待你把你的问题再补充一下。

我测试通过

mysql> select a.* from (select max(date) dates ,userid,money from moneys group by userid
,money) b,moneys a where a.userid=b.userid and a.money=b.money and a.date=b.dates;
SELECT * FROM (
    SELECT * FROM money m ORDER BY m.`date` DESC
    ) t GROUP BY t.userid

图片描述

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题