Sql 通过选择从表中获取一些值

Sql 通过选择从表中获取一些值,sql,oracle,select,Sql,Oracle,Select,我有一张桌子: | id | Number |Address | -----| ------------|----------- | 1 | 0 | NULL | 1 | 1 | NULL | 1 | 2 | 50 | 1 | 3 | NULL | 2 | 0 | 10 | 3

我有一张桌子:

| id   | Number      |Address 
| -----| ------------|-----------
| 1    | 0           |   NULL   
| 1    | 1           |   NULL   
| 1    | 2           |   50       
| 1    | 3           |   NULL     
| 2    | 0           |   10       
| 3    | 1           |   30       
| 3    | 2           |   20       
| 3    | 3           |   20       
| 4    | 0           |   75       
| 4    | 1           |   22       
| 4    | 2           |   30     
| 5    | 0           |   NULL     
我需要得到:每个ID最后一次地址更改的编号。 我写了这个选择:

select  dh.id, dh.number from table dh where dh = 
(select max(min(t.history)) from  table t where  t.id = dh.id group by t.address)
但此选择在地址第一次更改,然后更改为以前的值时未正确处理。例如id=1:group by return:

| Number |
| -------- | 
| NULL   | 
| 50  |  

我已经想了好几天了,我很乐意接受任何帮助。

我自己回答了我的问题,如果有人需要,我的解决方案是:

select * from table dh1 where dh1.number = (
  select max(x.number)
    from (
    select 
      dh2.id, dh2.number, dh2.address, lag(dh2.address) over(order by dh2.number asc) as prev
      from table dh2 where dh1.id=dh2.id 
    ) x  
    where NVL(x.address, 0) <> NVL(x.prev, 0) 
);
您可以使用row_number执行此操作-两次:

这样做的目的是按数字降序枚举行:

每个id一次。 每个id和地址一次。
只有当值为1(数据中最近的地址)时,这些值才相同。然后聚合将收回该组中最早的行。

您想要的结果是什么?是否要为每个id指定最大编号的行?所以对于id为1的情况,你会得到一个3的数字和一个null的地址?不,我不仅需要得到最大的数字,还需要得到地址最后一次更改的数字。例如,id=3,number=2这对您来说可能很清楚,但我恐怕不太清楚。您如何定义地址上次更改的时间?您想要的结果是什么?我不确定预期的输出应该是什么样子。你能给我们一个关于预期输出的提示吗?为什么不使用MAXNumber和GROUP BY id呢?如果不选择地址列,则会得到所需的输出。
select t.id, min(number)
from (select t.*,
             row_number() over (partition by id order by number desc) as seqnum1,
             row_number() over (partition by id, address order by number desc) as seqnum2
      from t
     ) t
where seqnum1 = seqnum2
group by id;