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子句,并且不能显式指定任何窗口子句。
代码有效。
TA贡献1786条经验 获得超11个赞
SELECT userid, MAX(value) KEEP (DENSE_RANK FIRST ORDER BY date DESC)
FROM table
GROUP BY userid
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
所以它有效,尽管其他地方提到的一些新东西可能更有效。
添加回答
举报