[SQL] query probleempje

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Stefke
  • Registratie: December 2000
  • Laatst online: 10:37
Ik zit al "jaren" met een dingetje in databases dat waar ik geen andere oplossing voor weet dan hetgeen ik altijd toepas.

Het gaat om het bepalen van de laagste "status" (of iets soortgelijks) van gegroepeerde zaken

IDStatusVolgorde
3A0
2B10
1C100


In mijn oplossing heeft een status een "volgorde" waarmee bepaalt wordt wat de prioriteit van een status is, in bovenstaand voorbeeld doelbewust niet gelijklopend met de ID (want dat levert mijn problem)

Stel ik heb een project dat onderverdeeld is in subprojecten. Die subprojecten hebben een kenmerk. Nu wil ik bepalen wat van een "kenmerk" (gegroepeerd) de laagste status is.

Bijv.:
project 1, subproject 1.1, kenmerk A1, status A
project 1, subproject 1.2, kenmerk B1, status B
project 1, subproject 1.3, kenmerk B1, status C
project 1, subproject 1.4, kenmerk A1, status C
project 1, subproject 1.5, kenmerk A1, status C

In dit geval is de laagste status voor kenmerk A1 "A", voor kenmerk B1 is de laagste status "B"

Zoals ik het oplos bepaal ik met een query (versimpeld) per "kenmerk" wat de laagste status-volgorde is
code:
1
2
Select subproject.Kenmerk, Min(status.volgorde) from subprojecten/status
GROUP BY Kenmerk, Volgorde


Later kan ik via de "volgorde" de statuseigenschappen erbij halen. Probleem is dat ik dit liever op de StatusID doe, maar die kan ik niet - voor zover ik weet - in de query erbij halen: zodra ik dit doe wordt de StatusID ook "gegroepeerd" en creert de statusID extra groepen waardoor ik niet meer één laagste status per "kenmerk" heb, maar per kenmerk/statusID wat niet werkt aangezien volgorde en statusID 1-1 verbonden zijn en ik vervolgens alle voorkomende statussen heb ipv alleen de laagste

Normaal is dit niet zo'n ramp en ik werk altijd al met deze oplossing, maar het gaat natuurlijk mis wanneer (onbedoeld) twee statussen dezelfde volgorde hebben, vandaar dat ik liever de statusID zou willen gebruiken om de resultaten van deze query aan de juiste status te knopen.

Nu kan ik op de een of andere manier voorkomen dat statussen dezelfde volgordenr kunnen hebben, maar ik vroeg mij af of de gewenste selectie met SQL toch mogelijk is? M.a.w. per kenmerk de laagste volgorde, maar met weergave van de statusID die hoort bij die volgorde

Dit is dus wat ik zoek:
code:
1
2
Select subproject.Kenmerk, Min(status.volgorde), subproject.StatusID from subprojecten/status
GROUP BY Kenmerk, Volgorde, StatusID

Maar dit levert een extra groeperingslevel op

Elke manier die ik kan verzinnen (bijv. een query na deze maken die de juiste statusID bij een volgorde opzoekt) heeft hetzelfde problem wanneer statussen hetzelfde volgordenr hebben

Het combineren van de twee waarden lijkt mij ook niet werken aangezien de ID elke "willekeurige" waarde kan hebben t.o.v. de volgorde en daarmee de volgorde in de war kan sturen.

Ik hoop dat duidelijk is wat mijn probleem is.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Tenzij ik over een detail heen lees lijkt me dit 'gewoon' een "groupwise maximum"-query. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • Stefke
  • Registratie: December 2000
  • Laatst online: 10:37
Nooit van gehoord :)

Als ik google kom ik zoiets tegen:
http://stackoverflow.com/...5211479/groupwise-maximum
SELECT p1.id,
p1.security,
p1.buy_date
FROM positions p1
left join
positions p2
on p1.security = p2.security
and p1.buy_date < p2.buy_date
where
p2.id is null;
Maar ik zie nog niet zo snel hoe dit werkt

edit: hmm...dit is handig :)
http://sqlfiddle.com/#!2/a7e00/5
Eens zien of ik hier uit kom

edit: nee...de voorbeelden hierboven halen de Max waarde uit dezelfde table. Ik moet de "volgorde" uit de gekoppelde tabel halen..geen idee hoe.

Zo begrijp ik niet wat het verschil is tussen deze twee
http://sqlfiddle.com/#!2/b5360/7 (zoals in dat forum voorgesteld)
http://sqlfiddle.com/#!2/b5360/6 (zelf gemaakt)
Hetzelfde resultaat


Dit is wat ik voor ogen heb:
http://sqlfiddle.com/#!2/35431/3
Maar hoe ik nu de MAx of Min volgorde van de status in acht moet nemen om per kenmerk te bepalen wat de betreffende max/min status is is mij niet duidelijk

[ Voor 51% gewijzigd door Stefke op 06-03-2016 22:30 ]


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
De vraag is eerder: is je status_volgorde UNIQUE of niet?
Zo niet, dan kunnen nog steeds A en D geselecteerd worden.

Verder zit het antwoord van je vraag in
code:
1
and p1.buy_date < p2.buy_date

[ Voor 72% gewijzigd door DJMaze op 06-03-2016 23:13 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Stefke
  • Registratie: December 2000
  • Laatst online: 10:37
DJMaze schreef op zondag 06 maart 2016 @ 22:44:
De vraag is eerder: is je status_volgorde UNIQUE of niet?
Zo niet, dan kunnen nog steeds A en D geselecteerd worden.

Verder zit het antwoord van je vraag in
code:
1
and p1.buy_date < p2.buy_date
In principe zijn de waarden uniek, maar het is - tenzij ik daar iets voor doe - wel mogelijk om niet unieke waarden in te voeren. En dan gaat het mis als ik via de volgorde de juiste status er bij moet zoeken.

Maar je hebt wel gelijk, als de status_volgorde niet uniek is gaat het bepalen van de minimale of maximale status al verkeerd, dus is het niet eens meer interessant om via de volgorde de status erbij te zoeken in de statustabel.

In de praktijk is het nog nooit misgegaan en mocht dat wel zo zijn dan is het zo opgelost (even de waarden uniek maken), maar ik was gewoon benieuwd of er een andere oplossing was.

Dat lijkt dus van niet (het afdwingen van een unieke volgorde lijkt meer de way to go om het probleem structureel te voorkomen)....al lijkt het er wel op dat ik met minder queries hetzelfde kan bereiken.

Ik ga nog wat stoeien op die site, tnx