[英]Multiple max values in a query
I know the title does not sound very descriptive, but it is the best I could think of: 我知道标题听起来不是很具描述性,但它是我能想到的最好的:
I have this table 我有这张桌子
ID BDATE VALUE 28911 14/4/2009 44820 28911 17/4/2009 32240 28911 20/4/2009 30550 28911 22/4/2009 4422587,5 28911 23/4/2009 4441659 28911 24/4/2009 7749594,67 38537 17/4/2009 58280 38537 20/4/2009 137240 38537 22/4/2009 81098692 38605 14/4/2009 2722368 38605 20/4/2009 5600 38605 22/4/2009 1625400 38605 23/4/2009 6936575
which is in fact a very complicated query encapsulated in a view, but it is not of the matter now. 这实际上是一个封装在视图中的非常复杂的查询,但现在不是问题。
I would like to have for each ID, the row containing the highest BDate. 我想为每个ID,包含最高BDate的行。 In this example, this would be the result.
在这个例子中,这将是结果。
ID BDATE VALUE 28911 24/4/2009 7749594,67 38537 22/4/2009 81098692 38605 23/4/2009 6936575
I have already tried 我已经尝试过了
select id, max(bdate), value from myview group by id, value
but then it returns all the rows, because for each the value collumn is different. 但随后它返回所有行,因为每个行的值不同。 This query is designed in Oracle v10, and I am eligible to use only select queries and not to create procedures.
此查询是在Oracle v10中设计的,我有资格仅使用选择查询而不是创建过程。
We can use multiply columns in an IN clause: 我们可以在IN子句中使用乘法列:
select id, bdate, value
from myview
where (id, bdate) in
(select id, max(bdate)
from myview group by id)
/
you can use the MAX...KEEP(DENSE_RANK FIRST...)
construct: 你可以使用
MAX...KEEP(DENSE_RANK FIRST...)
构造:
SQL> SELECT ID,
2 MAX(bdate) bdate,
3 MAX(VALUE) KEEP(DENSE_RANK FIRST ORDER BY bdate DESC) VALUE
4 FROM DATA
5 GROUP BY ID;
ID BDATE VALUE
---------- ----------- ----------
28911 24/04/2009 7749594,67
38537 22/04/2009 81098692
38605 23/04/2009 6936575
This will be as efficient as the analytics method suggested by Majkel (no self-join, a single pass on the data) 这将与Majkel建议的分析方法一样高效(没有自联接 ,单次传递数据)
You can use an INNER JOIN to filter out only the maximum rows: 您可以使用INNER JOIN仅过滤掉最大行:
select t.*
from YourTable t
inner join (
select id, max(bdate) as maxbdate
from YourTable
group by id
) filter
on t.id = filter.id
and t.bdate = filter.maxbdate
This prints: 这打印:
id bdate value
38605 2009-04-23 6936575
38537 2009-04-22 81098692
28911 2009-04-24 7749594.67
Note that this will return multiple rows for an id which has multiple values with the same bdate. 请注意,这将为id返回多行,该id具有多个具有相同bdate的值。
You can use analytics: 您可以使用分析:
select
id, bdate, value
from
(
select
id, bdate, value, max( bdate ) over ( partition by id ) max_bdate
from
myview
)
where
bdate = max_bdate
select a.* from myview a, (select id, max(bdate) from myview group by id) b
where a.id = b.id and a.bdate = b.bdate
SELECT id, bdate, value FROM myview
WHERE (id, bdate) IN (SELECT id, MAX(bdate) FROM myview GROUP BY id)
(untested... I don't have Oracle available right now...) (未经测试......我现在没有Oracle可用...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.