请帮我找到不同的行

时间:2015-02-24 14:30:05

标签: sql oracle

**P_NO       N_ADD           O_ADD            DATE_CHANGED**
*12646                  abc@gmail.com   02-JAN-15 10.17.52.000000000 AM*
12646   abc@gmail.com   test@gmail.com  02-JAN-15 10.15.52.000000000 AM
12646   abc@gmail.com                   02-JAN-15 10.15.52.000000000 AM
12646                   abc@gmail.com   02-JAN-15 10.13.25.000000000 AM
12646   abc@gmail.com   abc@gmail.com   02-JAN-15 10.13.25.000000000 AM

*12648                  test@gmail.com  24-FEB-15 01.46.46.000000000 PM*
12648   test@gmail.com  test@gmail.com  09-JAN-15 09.21.31.000000000 AM
12648   test@gmail.com  test@gmail.com  09-JAN-15 09.21.31.000000000 AM
12648   test@gmail.com  test@gmail.com  09-JAN-15 09.21.31.000000000 AM
12648   test@gmail.com  test@gmail.com  09-JAN-15 09.20.51.000000000 AM
12648   test@gmail.com  test@gmail.com  09-JAN-15 09.20.51.000000000 AM
12648   test@gmail.com  test@gmail.com  09-JAN-15 09.20.51.000000000 AM
12648   test@gmail.com  test@gmail.com  09-JAN-15 09.20.09.000000000 AM
12648   test@gmail.com  abc@gmail.com   09-JAN-15 09.20.09.000000000 AM

这是我从下面的查询得到的结构。

select * 
from test1 
where O_ADD is not null 
order by P_NO asc,DATE_CHANGED desc.

这里我只希望第一行是最近的,而N_ADD对于每个不同的P_NO都是null。如下。

**P_NO  N_ADD        O_ADD              DATE_CHANGED**
12646            abc@gmail.com      02-JAN-15 10.17.52.000000000 AM
12648            test@gmail.com     24-FEB-15 01.46.46.000000000 PM

任何人都可以帮我解决这个问题。

谢谢

2 个答案:

答案 0 :(得分:3)

如果您想要完整的行,请使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by p_no order by date_changed) as seqnum
      from table t
     ) t
where n_add is null and seqnum = 1;

答案 1 :(得分:0)

试试这个: -

SELECT P_NO, N_ADD, O_ADD, MAX(DATE_CHANGED)
FROM YOUR_TAB
WHERE N_ADD IS NULL
GROUP BY P_NO, N_ADD, O_ADD;