我有一点问题:
在我的表中,我有这些行:
PersHist :
ID Date Histroy
1 01.01.2008 0
1 01.01.2008 1
1 01.01.2008 2
1 02.01.2008 0
1 02.01.2008 1
现在当我选择像:
SELECT max(date), max(Histroy)
FROM PersHist
WHERE ID = 1
我收到了这个输出:
ID Date Histroy
1 02.01.2008 2
这是假的,因为没有02.01.2008/2
(日期/历史记录)
是否可以编写一个简单的SQL来获取02.01.2008/1
没有写子查询?
答案 0 :(得分:6)
试试这个。它将采用ID = 1的所有条目,按日期(最新到最旧)排序,然后按Histroy(降序)排序,然后返回第一个条目(即最新日期和此日期内最高的历史记录)。
SELECT * FROM
(SELECT ID, Date, Histroy
FROM PersHist
WHERE ID = 1
ORDER BY Date DESC, Histroy DESC)
WHERE ROWNUM = 1
不幸的是,如果没有子查询,它就无法运行。 Oracle首先归因于ROWNUM
,然后是ORDER
s
答案 1 :(得分:2)
使用keep (dense_rank first...
“idiom”:
create table tq84_pershist (
id number,
dt date,
histroy number
);
insert into tq84_pershist values (1, date '2008-01-01', 0);
insert into tq84_pershist values (1, date '2008-01-01', 1);
insert into tq84_pershist values (1, date '2008-01-01', 2);
insert into tq84_pershist values (1, date '2008-01-02', 0);
insert into tq84_pershist values (1, date '2008-01-02', 1);
使用此“设置”,查询将显示:
select max(dt ) keep (dense_rank first order by dt desc, histroy desc) dt,
max(histroy) keep (dense_rank first order by dt desc, histroy desc) histroy
from
tq84_PersHist;
导致
DT HISTROY
-------- ----------
02.01.08 1
答案 2 :(得分:1)
首先,您的查询正常工作(即符合SQL标准),因为它返回每个字段的最大值。仅仅因为它不是你想要的并不意味着它是错的......
要在没有子查询的情况下执行此操作,您需要使用分析函数:
SELECT distinct first_value(date) over (order by date desc, history desc),
first_value(history) over (order by date desc, history desc)
FROM PersHist
但是,子查询方法通常更快,特别是对于大型表。