最多乘以列

时间:2011-02-03 14:23:57

标签: sql oracle max

我有一点问题:

在我的表中,我有这些行:

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 没有写子查询?

3 个答案:

答案 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

但是,子查询方法通常更快,特别是对于大型表。