Oracle:从两个字段中获取最高值(日期,然后是值)

Oracle:从两个字段中获取最高值(日期,然后是值),oracle,oracle11g,top-n,Oracle,Oracle11g,Top N,我有这样的东西(日期简化为整数,仅作为示例): 我想得到日期最高的订单,然后是价值最高的订单: Order Date Value 12 5 800 13 4 155 14 1 121 ... ... ... 我知道这与其他几个问题类似,但我不知道如何将这些答案应用到我的案例中,对不起 谢谢 使用分析函数 使用分析函数 假设您的表名为orders 在子查询中,您可以找到具有最高日期的订单,以及找到值最高的订单。。。它将如下所示: select or

我有这样的东西(日期简化为整数,仅作为示例):

我想得到日期最高的订单,然后是价值最高的订单:

Order Date Value
12    5    800
13    4    155
14    1    121
...   ...  ...
我知道这与其他几个问题类似,但我不知道如何将这些答案应用到我的案例中,对不起

谢谢

使用分析函数

使用分析函数


假设您的表名为
orders

在子查询中,您可以找到具有最高
日期的
订单
,以及找到值最高的
订单
。。。它将如下所示:

   select order,date,max(value) value from orders
           where (order,date) in 
                           (select order, max(date) date
                            from orders
                            group by order
                           )
           group by order,date
           order by order,date desc

假设您的表名为
orders

在子查询中,您可以找到具有最高
日期的
订单
,以及找到值最高的
订单
。。。它将如下所示:

   select order,date,max(value) value from orders
           where (order,date) in 
                           (select order, max(date) date
                            from orders
                            group by order
                           )
           group by order,date
           order by order,date desc

您可以使用分析第一/最后一个函数(请参阅Oracle文档)。此解决方案不需要子查询/外部查询安排。我更改了列名,因为至少ORDER和DATE是Oracle关键字

with
     inputs ( ord, dt, val ) as (
       select 12, 5, 555 from dual union all
       select 12, 5, 800 from dual union all
       select 12, 2, 900 from dual union all
       select 13, 3, 122 from dual union all
       select 13, 4, 155 from dual union all
       select 14, 1, 121 from dual
     )
--  End of test data (not part of the solution).
--  SQL query begins BELOW THIS LINE
select   ord, max(dt) as dt, max(val) keep (dense_rank last order by dt) as val
from     inputs
group by ord
;

ORD  DT  VAL
---  --  ---
 12   5  800
 13   4  155
 14   1  121

您可以使用分析第一/最后一个函数(请参阅Oracle文档)。此解决方案不需要子查询/外部查询安排。我更改了列名,因为至少ORDER和DATE是Oracle关键字

with
     inputs ( ord, dt, val ) as (
       select 12, 5, 555 from dual union all
       select 12, 5, 800 from dual union all
       select 12, 2, 900 from dual union all
       select 13, 3, 122 from dual union all
       select 13, 4, 155 from dual union all
       select 14, 1, 121 from dual
     )
--  End of test data (not part of the solution).
--  SQL query begins BELOW THIS LINE
select   ord, max(dt) as dt, max(val) keep (dense_rank last order by dt) as val
from     inputs
group by ord
;

ORD  DT  VAL
---  --  ---
 12   5  800
 13   4  155
 14   1  121

使用
orderbydatedesc,value desc
@Seyran谢谢,非常简单。但是我怎么才能得到每个订单的“最高值”呢?如果我理解你的意思是正确的,那么你希望行的
Order
值,其中`date value`最高,应该是这样的,
select*from(…你的select Order by date desc,value desc),其中rownum=1
@Seyran几乎在那里。我需要得到每个订单的最新日期和之后的最高值。rownum=1应该以某种方式应用于订单级别。如果您在
date
value
中有两个值相同的记录,并且它们是最高的,但是
Order
是不同的,那么可能吗?使用
Order by date desc,value desc
@Seyran谢谢,非常简单。但是我怎么才能得到每个订单的“最高值”呢?如果我理解你的意思是正确的,那么你希望行的
Order
值,其中`date value`最高,应该是这样的,
select*from(…你的select Order by date desc,value desc),其中rownum=1
@Seyran几乎在那里。我需要得到每个订单的最新日期和之后的最高值。rownum=1应该以某种方式应用于订单级别。如果在
date
value
中有两个值相同的记录,它们是最高的,但
Order
是不同的,可能吗?很好的方法。。。值得一看。。。我投赞成票;-)好办法。。。值得一看。。。我投赞成票;-)