[SQL] group by probleem

Pagina: 1
Acties:

  • cashewnut
  • Registratie: Januari 2002
  • Laatst online: 09-11-2025
Ik heb twee tabellen: UserStories en UserStoriesHistory. Een record in UserStories kan nul of meer records hebben in UserStoriesHistory. UserStoriesHistory bevat een overzicht van de statuswijzigingen van een userstory. Met een left outer join wil ik de laatste status er ook bij uit trekken.

Dit is wat ik tot nu toe heb:

"SELECT UserStories.UserStoryId, MAX(UserStories.Title), MAX(UserStories.Effort), MAX(UserStories.BusinessValue), MAX(UserStories.Priority), MAX(UserStoriesHistory.ADDED), LAST(UserStoriesHistory.StatusId) "+
"FROM "+
"UserStories LEFT OUTER JOIN UserStoriesHistory ON UserStories.UserStoryId = UserStoriesHistory.UserStoryId "+
"WHERE UserStories.ProjectId = "+iProject+" "+
"AND UserStories.Priority IS NOT NULL "+
"AND (UserStories.IterationId IS NULL OR UserStories.IterationId >= "+limitIter+") "+
"AND UserStories.DELETED IS NULL "+
"GROUP BY UserStories.UserStoryId "+
"ORDER BY MAX(UserStories.Priority) ASC";

Probleem is dat de resultaten onbetrouwbaar zijn; meestal gaat het goed, maar soms wordt gewoon de verkeerde status teruggegeven. Dit komt (ws) doordat in de GROUP BY op zowel MAX(UserStoriesHistory.ADDED) als LAST(UserStoriesHistory.StatusId) gefilterd wordt. Maar ik moet een aggregate functie gebruiken voor alle velden, dus ook voor StatusId. Een subquery om de laatste ADDED te krijgen gaat ook niet werken omdat daar gefilterd moet worden op de actuele UserStoryId.

Als alternatief kan ik eerst gegevens uit UserStories halen, en vervolgens voor elke record de status ophalen. Dat was ook mijn eerste implementatie, maar bij grote lijsten is dit zoveel sneller.

De database is btw MS Access. Kan iemand mij helpen?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:31

Janoz

Moderator Devschuur®

!litemod

Misschien is het handiger waneer je je ietsje meer in de group by en aggregated functies verdiept. Een max van de title slaat natuurlijk helemaal nergens op.

Sowieso heb je voor het juist ophalen van deze gegevens niet met aggregate functions moeten werken, maar met HAVING. In de faq staat wel een klein stukje over het gebruik van GROUP BY.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • ronaldmathies
  • Registratie: Juni 2001
  • Niet online
Een MAX() functie wil zeggen dat je de hoogste waarde van de door de GROUP BY gegroepeerde regels wilt weten.

Dus wat Janoz al zegt. Het heeft geen zin om dit toe te passen op titels.
Dus ik zou inderdaad ook zeggen:
Verdiep je eerst eens in de functies als MAX(), MIN(), etc... dan zal het allemaal een stuk duidelijker worden.

3015 Wp-z 5360 Wp-nno op 2 x SMA-SB3600 TL-21, Warmtepomp: ERSC-VM2CR2 / PUHZ-SHW140 YHA, WTW Q350, EV Kia Ev6 GT-Line


  • cashewnut
  • Registratie: Januari 2002
  • Laatst online: 09-11-2025
Janoz schreef op woensdag 29 december 2004 @ 13:49:
Misschien is het handiger waneer je je ietsje meer in de group by en aggregated functies verdiept. Een max van de title slaat natuurlijk helemaal nergens op.

Sowieso heb je voor het juist ophalen van deze gegevens niet met aggregate functions moeten werken, maar met HAVING. In de faq staat wel een klein stukje over het gebruik van GROUP BY.
Ik weet dat het bij een textveld eigenlijk onzin is om MIN(), MAX() of wat dan ook te gebruiken, maar aangezien ik group by gebruik moet ik er toch een aggregate neerzetten (in dit geval maakt het ook niet uit, door de left outer join zijn er meerdere regels waarin dezelfde gegevens staan).

HAVING en GROUP BY kunnen toch niet zonder aggregate functies? :?.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Als ik het goed begrijp dan zoek je het in de verkeerde hoek.
De laatste status kun je opzoeken met een subquery, dan heb je de group by en having niet meer nodig.

Who is John Galt?


Verwijderd

waarom niet opdelen in een paar queries?

eentje die de laatste status van een bepaald iets opleverd die je dan kan joinen naar je hoofdtabel!?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:31

Janoz

Moderator Devschuur®

!litemod

Starbase218 schreef op woensdag 29 december 2004 @ 14:27:
[...]


Ik weet dat het bij een textveld eigenlijk onzin is om MIN(), MAX() of wat dan ook te gebruiken, maar aangezien ik group by gebruik moet ik er toch een aggregate neerzetten (in dit geval maakt het ook niet uit, door de left outer join zijn er meerdere regels waarin dezelfde gegevens staan).

HAVING en GROUP BY kunnen toch niet zonder aggregate functies? :?.
Ik snap je oorzaak gevolg niet helemaal. Ik gebruik een group by op 1 veld en moet dus maar alle andere velden een betekenisloze aggregate function geven. Waar groepeer je op? Niet op alleen het id, maar op meerdere velden uit die tabel. Neem al die velden dan op in je group by ipv nutteloze MAX functies erbij te zetten.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • cashewnut
  • Registratie: Januari 2002
  • Laatst online: 09-11-2025
Janoz schreef op woensdag 29 december 2004 @ 14:59:
[...]


Ik snap je oorzaak gevolg niet helemaal. Ik gebruik een group by op 1 veld en moet dus maar alle andere velden een betekenisloze aggregate function geven. Waar groepeer je op? Niet op alleen het id, maar op meerdere velden uit die tabel. Neem al die velden dan op in je group by ipv nutteloze MAX functies erbij te zetten.
OK, weer wat geleerd :). Maar daarmee verandert er natuurlijk niets aan het resultaat.

Ik weet niet of het helemaal duidelijk is wat de bedoeling is. Ik wil de StatusId uit de historytabel halen waar ADDED het hoogste is, voor elke UserstoryId. Die UserStoryId's moeten dan weer bij een project horen. De status moet dan samengevoegd worden met andere gegevens van die UserStory.

Ik heb het aan mijn collega's gevraagd, en volgens hen kan dit niet in een query. Dan maar een aparte query die alle records van hetzelfde project uit de historytabel haalt, en daar met een loopje steeds de laatste uithalen.

[ Voor 37% gewijzigd door cashewnut op 29-12-2004 19:36 ]


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Kijk, zoals justmental al aangaf, eens naar de mogelijkheden van een subquery. Dit lijkt me geen onoplosbaar probleem (wat je collega's aangeven). Maar misschien mis ik iets,.. of ik lees gewoon slecht, kan ook :)

Today's subliminal thought is:

Pagina: 1