Avatar billede yeti Nybegynder
17. november 2006 - 14:35 Der er 2 kommentarer og
2 løsninger

Hvordan laver jeg et loop?

Nedenstående kode giver mig det rigtige resultat, men kun for instrumentet '10002564'. Jeg har brug for at skifte '10002564' ud med et sub-select, så jeg kan generalliserer min forespørgsel til en række instrumenter. Jeg vil fortsat kun have de første 5 svar pr instrument.

Hvordan gør jeg det?


select * from (
select max(l.id), max(l.name), l.price, min(l.updat) as updat
from ci.instrument_log l
where l.id = '10002564'
group by price
)
where rownum < 6
order by updat desc
Avatar billede hgc Nybegynder
17. november 2006 - 14:57 #1
Du kan bruge row_number() isf. rownum. Selvom det lyder næsten ens er det meget forskellige syntax da row_number() er en af de analytiske funktioner.

Dette må være noget i stil med:

select * from (
select id, name, price, updat, row_number() over (partition by id order by updat desc) lbnr
from (select max(l.id) id, ................ from ci.instrument_log l
group by l.id, l.price)
)
where lbnr < 6

Forøvrigt kan du ikke være sikker på at du får de 5 nyeste når du har rownum < 6 og order by på samme niveau, idet den laver afgrænsning på de 5 rækker først og sorteringen bagefter.

vh Henning
Avatar billede yeti Nybegynder
17. november 2006 - 15:19 #2
Hej Henning,

Jeg har prøvet at indsætte det jeg gerne vil skifte instrument id'et ud med ind. Jeg kan ikke helt gennemskue hvor det skal ind i den kode du har lavet.

select * from (
select max(l.id), max(l.name), l.price, min(l.updat) as updat
from ci.instrument_log l
where l.id in (select i.id from ci.instrument i where i.name like '%CDS%')

group by price
)
where rownum < 6
order by updat desc
Avatar billede hgc Nybegynder
19. november 2006 - 20:22 #3
"l.id in (select i.id from ci.instrument i where i.name like '%CDS%') " skal tilføjes den inderste select,
det må også betyde at du skal bruge l.id isf. max(l.id)

select * from (
select id, name, price, updat,
      row_number() over (partition by id order by updat desc) lbnr
  from (select l.id, max(l.name) name, l.price, min(l.updat) updat
          from ci.instrument_log l
        where l.id in (select i.id from ci.instrument i where i.name like '%CDS%')
        group by l.id, l.price))
)
where lbnr < 6
Avatar billede yeti Nybegynder
20. november 2006 - 13:38 #4
Det virker (bortset fra en parantes for meget) - tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester