Toon posts:

[SQL] lijst met hoogste waardes

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo mensen :),

ik heb het volgende probleem:

ik heb deze statement:

SELECT * from procedures
WHERE verwijderd = true
OR majver < (select max(majver) from procedures)
OR (
majver = (select max(majver) from procedures)
AND minver < (select max(minver) from procedures)
);

maar deze is niet helemaal correct. Het idee is dat er een tabel bestaat met procedures, en elke procedure heeft een NR, (die vaker kan voorkomen) en een versie (MAJVER en MINVER). Nu moet hij alle verwijderden terug geven (dat is al klaar) en alle procedures met NIET de hoogste versie. Kortom, van elk procedurenr moeten er een aantal terug komen, behalve de hoogste versie van dat procedurenr.

select max(majver) from procedures

Hier moet dus een select statement komen die mij de hoogste major versie geeft voor de procedurenummer waar hij bij staat. Kortom, als er 10x een procedurenr 4 voor komt, en de hoogste MajVer daarvan is 8, dan moet hij alleen de regel met 8 terug geven in dat select statement.

Ik dacht misschien iets met een GroupBy, maar ik kom er niet uit ;(

Als dat select statementje werkt, dan kom ik er verder zelf wel uit.

  • André
  • Registratie: Maart 2002
  • Laatst online: 18-05 16:30

André

Analytics dude

Moet dat niet zoiets zijn:

code:
1
SELECT * FROM procedures WHERE majver = (SELECT MAX(majver) FROM procedures) GROUP BY majver

Verwijderd

Topicstarter
nee want als je dan select max(MAJVER) doet, krijg je maar 1tje terug. de grootste van ALLE procedures, ipv alleen de procedures met hetzelfde procedurenr

Dus eigenlijk zou je iets moeten kunnen zeggen van:

Select max(majver) from een groepje procedures met hetzelfde procnr, en dat voor elk groepje met hetzelfde procnr

[ Voor 36% gewijzigd door Verwijderd op 22-10-2004 09:12 ]


Verwijderd

Iets alla in pseudo

code:
1
2
3
4
5
6
7
SELECT *
FROM Procedures
WHERE verwijderd = true
JOIN( SELECT MajorVersion = MAX (P.majvr)
          FROM    Procedures P                  
          GROUP BY P.majvr) AS MP ON ((P.ProcedureID = PR.ProcedureID))
JOIN Procedures P1  ON ((P1.ProcedureID = MP.ProcedureID) AND (P1.majvr = MP.MajorVersion))

Verwijderd

Topicstarter
hm okee bedankt! Ik wist niet veel van JOINS, maar ik get the idea nu.

Als ik het goed begrijp bij een join, na de ON staat de reeks waarop de statement ervoor betrekking heeft. En de resultaten daarvan komen in hetgeen achter AS.

en met:
P.ProcedureID = PR.ProcedureID

met PR bedoel je PROCEDURES die bovenaan staat achter de FROM

Bedankt!

[ Voor 72% gewijzigd door Verwijderd op 22-10-2004 09:58 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT P.* 
FROM
  Procedures P,
  (SELECT P1.procnr, MAX(P1.majvr) AS majvr FROM Procedures P1 GROUP BY P1.procnr) as P_Max
WHERE
  P.Procnr = P_Max.procnr
 AND 
  (
    verwijderd = true
    OR
    P.majvr < P_Max.majvr
    OR
    (P.majvr = P_Max.majvr AND P.minvr < (SELECT P2.minvr FROM Procedures P2 WHERE P2.procnr = P_Max.procnr AND P2.majvr = P_Max.majvr))
  )


Volgens mij zoek je zoiets. Evt kan je die eerste vergelijking ook met een JOIN oplossen en de tweede subselect kan waarsch ook wel aan de eerste gejoined worden, maar imho is de query zo duidelijker leesbaar

[ Voor 29% gewijzigd door ACM op 22-10-2004 10:04 ]


Verwijderd

Topicstarter
(SELECT P1.procnr, MAX(P1.majvr) AS majvr FROM Procedures P1 GROUP BY P1.procnr) as P_Max

daarmee levert hij toch maar 1 regel op, aangezien die MAX altijd maar 1 resultaat geeft?

Of snapt hij door de GROUP BY, dat hij de MAX uitvoert op elke groep die door de GROUP BY is gemaakt?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Nee, je maakt een "tabel" met per procnr de maximale majvr, en die tabel gebruik je verder in de rest van de selectieprocedure. En ja, dat is dus precies wat group by doet, wat jij beschrijft in je vraag ;)

[ Voor 12% gewijzigd door ACM op 22-10-2004 10:39 ]


Verwijderd

Topicstarter
ik heb het zo opgelost nu:


SELECT * from procedures p
WHERE verwijderd = true
OR majver <
(SELECT majver FROM
(select ProcNr, max(majver) FROM procedures GROUP BY ProcNr)
WHERE
p.ProcNr = ProcNr
) AS maxmaj
OR (
majver = maxmaj
AND minver <
(select max(minver) FROM
(SELECT ProcNr, majver, minver FROM procedures WHERE majver=maxmaj
AND ProcNr = p.ProcNr )
)
);
Pagina: 1