Gå til innhold

Sortering på største verdi av ett felt gruppert på ett annet


Anbefalte innlegg

Spørsmål:

Jeg ønsker å få gruppert alle radene på en verdi ut fra maksverdien av en annen i ett eneste sql-kall.

 

Dvs:

(Dato (egentlig datetime)-ens maksverdi er kriterie for sorteringsrekkefølgen på modul, param3 og param4 er andre felter i tillegg bare for å vise at de også skal listes med)

 

modul|dato|param3|param4

3|20080501|x1|y1

3|20080428|x5|y5

2|20080429|x2|y2

2|20080428|x3|y3

1|20080225|x4|y4

 

Her vises ett ønsket resultat hvor modul 3 listet øverst fordi det har den høyeste verdien av dato. Deretter er alle andre datoer listet for samme modul, før den går over på modul med nest høyeste dato osv osv.

 

Etter endel prøving og feiling satte jeg opp dette sql-kallet:

 

SELECT

modul

,dato

,param3

,param4

FROM modul_tabell

GROUP BY modul,dato,param3,param4

ORDER BY MAX(dato) DESC

 

Men dette gir bare tilsynelatende riktig resultat...

 

Jeg har også prøvd med å joine med en subselect som har

(

SELECT modul

FROM modul_tabell

GROUP BY modul

ORDER BY MAX(dato)

) AS max_modul

 

Men da falt jeg av lasset med hvordan JOINe...

 

Jeg prøver å unngå å måtte lagre en mengde data i skriptspråket jeg bruker for etterbehandling og sortering.

Noen som kan kaste lys over en forståelse av dette?

 

Mvh Kåre Olai

Lenke til kommentar
Videoannonse
Annonse
...
(select row_number() over(order by max(dato) desc) as sort
...

 

Takk for rask respons! Og du er absolutt i blink med det jeg var ute etter.

 

Dette fikk meg til å slå opp på OVER, samt sette meg inn i ranking-funksjoner. Ja, jeg hadde stor tillit til at dette var svaret som skulle sette meg på en løsning, men dessverre...

 

... ser det ut til at oppdragsgiveren kun har Transact-SQL versjon, (Microsoft versjon), fra før 2006 elns, for ingen av ranking-funksjonene aksepteres som gyldige funksjonsnavn. :(

 

Ut fra dette har jeg noen muligheter: enten få de til å legge inn nyere versjon,

eller har noen noe tips om måter å få dette til uten å bruke ranking-funksjon?

 

 

Uansett, mange takk!

 

Mvh Kåre Olai

Lenke til kommentar
...

Ut fra dette har jeg noen muligheter: enten få de til å legge inn nyere versjon,

eller har noen noe tips om måter å få dette til uten å bruke ranking-funksjon?

...

 

Tom Ivar Helbekkmo over i nyhetsgruppa no.it.database.diverse gav meg viktige innspill, og løsningen lå i å lage ett view, og så bruke JOIN på dette viewet. Jeg fikk ikke "SELECT .... FROM tabell,view" til å virke da jeg hadde en nødvendig join mot en mellomtabell lengre ned. (Ja, selve sql-kallet er endel mer komplisert enn viste problemstilling)

 

<quote TIH>

Dersom du har et produkt som ikke håndterer en SELECT i en FROM, kan du

erstatte dette med et VIEW:

 

CREATE VIEW nymodul (modul, maxdato) AS

SELECT modul, MAX(dato)

FROM moduler

GROUP BY modul;

 

SELECT m.modul, m.dato, m.param3, m.param4

FROM moduler AS m, nymodul AS n

WHERE m.modul = n.modul

ORDER BY n.maxdato DESC, m.modul, m.dato DESC;

</quote>

 

Denne brukte jeg som utgangspunkt for min løsning, mot at WHERE-klausen ble satt opp som en INNER JOIN.

 

 

 

Takk for innspillet, dog!

 

Mvh Kåre Olai

Lenke til kommentar

Har ikke sjekket forumet før nå, men det er godt at du fant en løsning.

 

Nå ser du nok også viktigheten av å fortelle hvilket system du bruker når du ber om hjelp :)

 

Eneste endringen jeg ville gjort på løsningen fra TIH er å skrive det om til å bruke INNER JOIN for lesbarhetens skyld. For de fleste databasemotorer vil det nok ikke ha noe å si om du skriver det på den ene eller andre måten da query optimiseren sannsynligvis vil eksekvere begge typer spørring på samme måte, men det er litt 80'ish å skrive spørringen på måten det er gjort.

Lenke til kommentar

Liker ikke views.

 

select dub.*
from 
(
	SELECT ModulePartID
		, MAX (CreatedDate) as maxDateByModulePartID
	FROM tblNode
	group by ModulePartID
) as sub
inner join 
(
	select ModulePartID
		, CreatedDate
	from tblNode
) as dub on dub.modulepartid = sub.modulepartid
order by sub.maxDateByModulePartID desc
, dub.CreatedDate desc

 

Grunnen til at dette funker, er fordi man joiner på noe som er gruppert, og man sorterer ikke på noe i resultatsettet for joinen.

Endret av Kul drittunge
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...