Pobranie rekordów z dwoma maksymalnymi datami dla każdego id

0

Cześć,
Mam przykładową tabelę:
ID DATA
0 201112051325
0 201112051320
0 201112051315
1 201112051325
1 201112051320
1 201112051315
2 201112051320
2 201112051315
2 201112051310

chciałabym z takiej tabeli pobrać rekordy, które mają dwie "najbardziej świeże" daty - powinno to być pogrupowane po id czyli chciałabym osiągnąć następujący wynik:

ID DATA
0 201112051325
0 201112051320
1 201112051325
1 201112051320
2 201112051320
2 201112051315

Nie mogę najpierw zrobić selecta, aby pobrać maksymalne dwie daty w całej bazie, a potem przyrównać:
select * from tabela where data=max_data1 or data=max_data2
gdyż jak widać rekord o id=2 najaktualniejszą datę ma ustawioną na godzinę 13:20 a nie 13:25 jak w dwóch pozostałych.

Czy ktoś mógłby pomóc jak za to się w ogóle zabrać?

0

Sarrus - może źle się wyraziłam, właśnie chcę osiągnąć taki efekt, wiem że rekordy z id=2 są poprawnie wyświetlone :) Jakie mądre zapytanie SQL do tego można napisać ?

0

SQL> @@1.sql
SQL> create table dane (
2 id integer,
3 data integer
4 );

Table created.

SQL>
SQL> insert into dane values (0,201112051325);

1 row created.

SQL> insert into dane values (0,201112051320);

1 row created.

SQL> insert into dane values (0,201112051315);

1 row created.

SQL> insert into dane values (1,201112051325);

1 row created.

SQL> insert into dane values (1,201112051320);

1 row created.

SQL> insert into dane values (1,201112051315);

1 row created.

SQL> insert into dane values (2,201112051320);

1 row created.

SQL> insert into dane values (2,201112051315);

1 row created.

SQL> insert into dane values (2,201112051310);

1 row created.

SQL> insert into dane values (2,201112051320);

1 row created.

SQL>
SQL> select * from dane;

    ID          DATA                                                        

     0  201112051325                                                        
     0  201112051320                                                        
     0  201112051315                                                        
     1  201112051325                                                        
     1  201112051320                                                        
     1  201112051315                                                        
     2  201112051320                                                        
     2  201112051315                                                        
     2  201112051310                                                        
     2  201112051320                                                        

10 rows selected.

SQL>
SQL> select id,data
2 from (select id, data, row_number() over (partition by id order by d.data desc) rn
3 from dane d)
4 where rn < 3;

    ID          DATA                                                        

     0  201112051325                                                        
     0  201112051320                                                        
     1  201112051325                                                        
     1  201112051320                                                        
     2  201112051320                                                        
     2  201112051320                                                        

6 rows selected.

SQL>
SQL> drop table dane;

Table dropped.

SQL> spool off

0

Dziękuję, bardzo mi pomogłeś !

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0