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

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