Toon posts:

[Oracle query] alleen de meest oude records

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig om een script te bouwen om wat zaken in oracle op te ruimen. Ik heb nu als onderdeel hiervan een query die kijkt naar alle gegevens die op basis van een bepaalde waarde dubbel in een tabel staan. Nu wil ik echter alleen de waarden hebben van deze lijst waarbij de creation_date de meest oude is.

Ik heb de volgende query op dit moment:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select 
      * 
from 
    qp_pricing_attributes qpa 
where qpa.list_line_id in 
      (
       select
            qpa.list_line_id
       from 
           qp_pricing_attributes qpa
           having count(qpa.list_line_id) >1
       group by          
               qpa.list_line_id
       )


nu echter nog iets wat er voor zorgt dat ik alleen de records krijg waarvoor staat dat ze op basis van de sub-query meer dan 1 record hebben in de tabel en dat ze de oudste creationdate hebben...
iets in de trand van dit dus:

code:
1
where qpa.creation_date = max(qpa.creation_date)


dit krijg ik echter nog niet voor elkaar... iemand een goed idee?

  • momania
  • Registratie: Mei 2000
  • Laatst online: 19:31

momania

iPhone 30! Bam!

"order by" op die datum en dan met iets als een limit maar 1 record dus ophalen :)

volgens mij is dat in oracle iets als "where rownum = 1"

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Topicstarter
momania schreef op woensdag 08 februari 2006 @ 17:24:
"order by" op die datum en dan met iets als een limit maar 1 record dus ophalen :)

volgens mij is dat in oracle iets als "where rownum = 1"
Helaas zal dit volgens mij niet gaan werken aangezien ik dan maar 1 record terug krijg terwijl ik van de totaal 600 records die de sub-query maakt er maar 250 over wil houden op basis van dat de creation_date de meest oude creation_date is... or for that matter de meest recente creation_date heeft.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

code:
1
2
3
4
5
where qpa.creation_date = 
(select min(qpa2.creation_date)
 from   qp_pricing_attributes qpa2
 where qpa2.key = qpa.key
)

zoiets bedoel je?

momania: dat werkt niet omdat de where voor de order by wordt uitgevoerd.

Who is John Galt?


  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 19-12-2025

wizzkizz

smile...tomorrow will be worse

heeft oracle niet iets zoals LIMIT in mySQL? dan kun je doen select * from .... order by creationdate desc limit 250

of niet :?

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


Verwijderd

Topicstarter
wizzkizz schreef op woensdag 08 februari 2006 @ 17:44:
heeft oracle niet iets zoals LIMIT in mySQL? dan kun je doen select * from .... order by creationdate desc limit 250

of niet :?
Helaas niet bruikbaar omdat we dus niet exact weten of in alle gevallen we de eerste 250 moeten hebben... het is afhankelijk van een voorwaarde niet van een hard-code value.

Verwijderd

Topicstarter
justmental schreef op woensdag 08 februari 2006 @ 17:28:
code:
1
2
3
4
5
where qpa.creation_date = 
(select min(qpa2.creation_date)
 from   qp_pricing_attributes qpa2
 where qpa2.key = qpa.key
)

zoiets bedoel je?

momania: dat werkt niet omdat de where voor de order by wordt uitgevoerd.
Jeps dit werkt.... uiteindelijk heb ik de logic ook wat aan moeten passen omdat blijkt dat er soms twee records zijn die op de seconde een zelfde creation_date hebben dus heb ik het op basis van een unieke waarde gedaan welke door een sequence aangemaakt word.

aldus, enzo,..... dit is het uiteindelijk geworden

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
select 
      * 
from 
    qp_pricing_attributes qpa 
where qpa.list_line_id in 
      (
       select
            qpa.list_line_id
       from 
           qp_pricing_attributes qpa
           having count(qpa.list_line_id) >1
       group by          
               qpa.list_line_id
       )
and
   qpa.pricing_attribute_id = (
             select min(qpa2.pricing_attribute_id)
              from   qp_pricing_attributes qpa2
              where qpa2.list_line_id = qpa.list_line_id 
                                        )

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 23:09

JaQ

Verwijderd schreef op woensdag 08 februari 2006 @ 17:21:
dit krijg ik echter nog niet voor elkaar... iemand een goed idee?
having is je vriend:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
select 
      * 
from 
    qp_pricing_attributes qpa 
where qpa.list_line_id in 
      (
       select
            qpa.list_line_id
       from 
           qp_pricing_attributes qpa
           having count(qpa.list_line_id) >1
       group by          
               qpa.list_line_id
       )
having qpa.creation_date = min(qpa.creation_date)


nou weet ik alleen niet meer zeker of je een group by moet gebruiken bij having, maar dat merk je vanzelf ;) )

[edit]Je zoekt de oudste, dus niet max(qpa.creation_date), maar min(qpa.creation_date). Hierbij ga ik er wel vanuit dat het daadwerkelijk een kolom is met datatype date)

[ Voor 12% gewijzigd door JaQ op 08-02-2006 22:32 ]

Egoist: A person of low taste, more interested in themselves than in me


  • lier
  • Registratie: Januari 2004
  • Laatst online: 22:59

lier

MikroTik nerd

Ik weet niet zo veel van Oracle, maar bestaat "top" niet ?

SELECT TOP 250
FROM [tblName]
ORDER BY [creationdate] DESC

Ik zie nu pas de onderstaande quote
Helaas niet bruikbaar omdat we dus niet exact weten of in alle gevallen we de eerste 250 moeten hebben... het is afhankelijk van een voorwaarde niet van een hard-code value.
Kan je de Select statement dynamisch opbouwen ?

[ Voor 56% gewijzigd door lier op 08-02-2006 22:30 ]

Eerst het probleem, dan de oplossing


Verwijderd

Topicstarter
lier schreef op woensdag 08 februari 2006 @ 22:29:

Kan je de Select statement dynamisch opbouwen ?
je zou er een PL/SQL script van kunnen bakken met een aantal var's er in.... waarin je een count maakt van het aantal regels wat zou voldoen aan je voorwaarde van de oudste records en dan een totaal query maken en dan een top nemen met het aantal regels wat uit de count komt maar dat zou nutteloos zijn omdat je voor de count al een query moet maken die je het eindresultaat geeft in plaats van count kun je dan beter gewoon alle gegevens vragen die je wilt hebben.

Dus ja je kan een dynamisch select statement maken maar dat heeft in dit geval niet heel veel zin volgens mij.

Verwijderd

Topicstarter
Een heel ander iets over dit topic. Misschien dat er mensen zijn die zich afvragen waar deze query voor dient. (mensen die niet werken met de Oracle advanced pricing module kunnen nu afhaken denk ik)

Als je in Oracle advanced pricing een modiffier aanmaakt (modiffier header) dan kun je hier modiffier lines aan hangen. Elke modiffier line is in princiepe uniek. Als je het "Advanced pricing - Define modifier" scherm open hebt dan kun je aan de bovenkant de modifier header informatie zien en aan de onderkant van het scherm de modifier lines welke aan de modifier header zijn gelinkt.

Het scherm haalt de modifier headers informatie uit de view "qp_secu_list_headers_vl"
Het scherm haalt de modifier lines informatie uit de view "qp_modifier_summary_v"

Nu kan het in sommige gevallen zijn dat er dubbele modifier lines aanwezig zijn in het scherm en dus ook in de view. Dit kan komen (altans in mijn geval omdat er een interface is gebruikt om oracle apps te vullen met informatie) dat er meerdere records met het zelfde "list_line_id" voorkomen in een van de tabellen die gebruikt worden om de view aan te maken (qp_pricing_attributes). Om dit probleem op te lossen kun je dus de query die hierboven staat gebruiken zodat je de dubbele te zien krijgt. In plaats van een select kun je aan de query ook een delete hangen.

Om er voor te zorgen dat dit in de toekomst niet meer kan gebeuren kun je de table "qp_pricing_attributes" tweaken, dit is iets wat eigenlijk door Oracle gedaan had moeten worden in mijn ogen, je kan list_line_id uniek maken zodat als er een record aangemaakt word wat al bestaat het niet geaccepteerd word.

Na wat overleg met andere developers van OAP blijkt dat dit probleem zich vaker voordoet en ik heb ondertussen al een change request bij Oracle ingdiend om deze functie in een volgende versie direct in te bouwen.

Waarschijnlijk niet een interesant stuk voor mensen die niet met OAP werken en ook een beetje offtopic maar toch gepost omdat het in mijn ogen heel handig kan zijn voor mensen die hier wel mee werken en dit probleem ondervinden.
Pagina: 1