Archief - [PROG]SQL Min en max op groepen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

[AiR] LeViaTHaN

Legacy Member
Ik heb een tabel die er als volgt uit ziet:

A B Begin Einde
------------------------------------------------------------------
1 2 01/01/2005 01/02/2006
1 2 02/02/2006 NULL
1 3 01/01/2006 01/02/2006
1 3 02/02/2006 01/03/2006
1 4 01/05/2005 01/06/2005

Wat mijn query moet doen is volgende output:

A B Begin Einde
------------------------------------------------------------------
1 2 01/01/2005 NULL
1 3 01/01/2006 01/03/2006
1 4 01/05/2005 01/06/2005


Begin moet dus de kleinste waarde zijn van de groep AB en Einde moet de grootste waarde zijn van deze groep, NULL is altijd de grootste waarde.

Ik heb nu opgelost met een cursor (:naughty:) maar om de tabel te doorlopen duurt dit 1min30sec. Er zitten nu wel meer dan 300000 rijen in die tabel maar toch denk ik dat er een betere oplossing moet zijn.

Alle hulp welkom :)

[AiR] LeViaTHaN

Legacy Member
Hoe gaat een order by mijn probleem kunnen oplossen?
Van 2 rijen (of meer) wil ik één rij maken met kleinste begin datum en grootste einddatum.
Als je een group by bedoelt dan moet ik je ook terleurstellen want dan krijg je hetzelfde resultaat als mijn begintabel.

Zhergan

Legacy Member
probeer eens met:
select A, B, min(begin), max(einde) from tabel
group by A, B

[AiR] LeViaTHaN

Legacy Member
Ook al geprobeerd dit neemt enkel min en max van de eerste rij in de groep. :(

Emerxill

Legacy Member
ne left join op zijn eigen doen? :unsure:
*edit*
Dat gaat ook al niet helpen, ge kunt missch cheaten Max(isNull(stop, '1/1/9999')), weet niet of dat gaat werken :D

Zhergan

Legacy Member
Oke, even getest, het probleem zit hem in de null-waarde. Voor M$ is de null-waarde de laagste dat er is. Probleem is dat je met de standaard-sql geen geuniformiseerde conversie-functie bestaat, je hebt er wel specifiek voor de verschillende databases.

Voor microsoft zal het volgende statement wel moeten werken:
Select A, B, min(begin), max(iif(isnull([einde]);#12/31/2199#;[einde]) from tabel
group by A,B

[AiR] LeViaTHaN

Legacy Member
bedankt zhergan & emerxill!

heb 'm een beetje aangepast om te werken in SQL 2005.
En ben op dit gekomen:

Code:
SELECT 
A,
B,
MIN([begin]),
CASE 
	WHEN MAX(ISNULL(einde, '1/1/9999')) = '1/1/9999' THEN NULL
	ELSE MAX(einde)
END
FROM Test
GROUP BY A, B
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan