为了账号安全,请及时绑定邮箱和手机立即绑定

获取具有列的最大值的行

获取具有列的最大值的行

繁星淼淼 2019-05-21 16:13:24
获取具有列的最大值的行表:UserId, Value, Date.我想得到UserId,每个UserId的max(Date)值。也就是说,具有最新日期的每个UserId的值。有没有办法在SQL中执行此操作?(最好是Oracle)更新:对任何含糊不清的道歉:我需要获得所有UserIds。但对于每个UserId,只有该用户具有最新日期的那一行。
查看完整描述

4 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

这将检索my_date列值等于该userid的my_date的最大值的所有行。这可以为userid检索多行,其中最大日期在多行上。


select userid,

       my_date,

       ...

from

(

select userid,

       my_date,

       ...

       max(my_date) over (partition by userid) max_my_date

from   users

)

where my_date = max_my_date

“分析功能摇滚”


编辑:关于第一条评论......


“使用分析查询和自连接会破坏分析查询的目的”


此代码中没有自联接。而是在内联视图的结果上放置了一个谓词,其中包含分析函数 - 一个非常不同的问题,以及完全标准的实践。


“Oracle中的默认窗口是从分区的第一行到当前的一行”


windowing子句仅适用于order by子句的存在。如果没有order by子句,则默认情况下不应用windowing子句,并且不能显式指定任何窗口子句。


代码有效。


查看完整回答
反对 回复 2019-05-21
?
Qyouu

TA贡献1786条经验 获得超11个赞

SELECT userid, MAX(value) KEEP (DENSE_RANK FIRST ORDER BY date DESC)

  FROM table

  GROUP BY userid


查看完整回答
反对 回复 2019-05-21
?
长风秋雁

TA贡献1757条经验 获得超7个赞

没有工作,我没有掌握Oracle,但我似乎记得Oracle允许在IN子句中匹配多个列,这至少应该避免使用相关子查询的选项,这很少是一个好的理念。


也许这样的事情(不记得列列表是否应该加括号):


SELECT * 

FROM MyTable

WHERE (User, Date) IN

  ( SELECT User, MAX(Date) FROM MyTable GROUP BY User)

编辑:刚尝试真实:


SQL> create table MyTable (usr char(1), dt date);

SQL> insert into mytable values ('A','01-JAN-2009');

SQL> insert into mytable values ('B','01-JAN-2009');

SQL> insert into mytable values ('A', '31-DEC-2008');

SQL> insert into mytable values ('B', '31-DEC-2008');

SQL> select usr, dt from mytable

  2  where (usr, dt) in 

  3  ( select usr, max(dt) from mytable group by usr)

  4  /


U DT

- ---------

A 01-JAN-09

B 01-JAN-09

所以它有效,尽管其他地方提到的一些新东西可能更有效。


查看完整回答
反对 回复 2019-05-21
  • 4 回答
  • 0 关注
  • 452 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信