我有这个数据样本:
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表达式
答案 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_RANK
或FIRST
聚合函数。
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;
答案 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