开发者社区> 问答> 正文

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

展开
收起
我的中国 2016-02-07 18:24:35 2429 0
1 条回答
写回答
取消 提交回答
  • R&S网络资深工程师 ,阿里云论坛官方版主,阿里云云计算ACP,春考教学网站长,IT技术晋级之路专辑作者
    采纳回答

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

    你可能是想得到:

    最后一天的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同一天有多条,无解了。

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

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

    2019-07-17 18:28:17
    赞同 1 展开评论 打赏
问答分类:
SQL
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载