查询以获取最新记录并使用更高的值

时间:2018-03-29 10:24:49

标签: sql oracle

我有这个数据样本:

card  service       date       value
  1      1       27-10-2014      5
  1      1       28-10-2014      5
  1      1       28-10-2014      6

返回最后一行的最佳方法是什么(最近一次并且在关联的情况下更高的值)?

提前致谢。

编辑:

 card  service       date       value
   1      1       27-10-2014      5
   1      1       28-10-2014      5
   1      1       28-10-2014      6
   2      2       29-10-2014      7

这应该已经返回了第3和第4条记录。

感谢所有回复。但今天我有一个小的变更请求。我将有一个具有百分比的列和另一个带有字符的列,以指示值是值还是百分比。

我正在尝试做这样的事情:

 select  card,
                         service,
                         max(date),
                         case when type = 'v'
                         then
                         MAX(value) KEEP (
                            dense_rank first order by date desc
                        )
                         else 
                         max(percentage) valor keep (
                           dense_rank first order by date desc
                         ) end   
                 from table
                 group by card,
                 service;

但我得到了ORA-00979:不是GROUP BY表达式

5 个答案:

答案 0 :(得分:3)

那么您想要具有最新日期和最高值的行吗?

如果你在12.1及以上,你可以先使用fetch。按日期和值降序排序,得到一行:

create table t (
  card int, service int, dt date, val int
);

insert into t values (1, 1, date'2014-10-27', 5);
insert into t values (1, 1, date'2014-10-28', 5);
insert into t values (1, 1, date'2014-10-28', 6);

select * from t
order  by dt desc, val desc
fetch first 1 row only;

CARD   SERVICE   DT                     VAL   
     1         1 28-OCT-2014 00:00:00       6 

在11.2及更早版本中,您需要一个子查询,您可以在其中指定按日期和值排序的行号:

with ranked as (
  select t.*,
         row_number() over (order by dt desc, val desc) rn
  from   t
)
  select * from ranked
  where  rn = 1;

CARD   SERVICE   DT                     VAL   RN   
     1         1 28-OCT-2014 00:00:00       6    1 

答案 1 :(得分:2)

一种好方法是使用KEEP..DENSE_RANKFIRST聚合函数。

SELECT card
    ,service
    ,MAX(date_t)
    ,MAX(value) KEEP (
        DENSE_RANK FIRST ORDER BY date_t DESC
        ) AS value
FROM yourtable
GROUP BY card
    ,service;

Demo

答案 2 :(得分:1)

试试这个:

select *
from (
  select x.*
  from <tablename> x
  where date = (select max(date) from <tablename> )
  order by value desc
) where rownum<2 ;

答案 3 :(得分:1)

尝试此查询: -

    SELECT TOP 1 * FROM tableName ORDER BY dateCol1 DESC,valueCol2 DESC;

答案 4 :(得分:0)

MySQL中的简单解决方案,

    select * from demo_table t
    where value = (select max(value) from demo_table)
    order by date desc limit 1