Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

2 views
Skip to first unread message

Kåre Olai Lindbach

unread,
May 19, 2008, 4:54:16 PM5/19/08
to
Hei, lenge siden jeg har skrevet noe her nå!

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

Dvs:
(modul er hovedsortering, dato (egentlig datetime) er
maksverdi-kriterie, 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

Er det riktig tenkt, eller gir det bare tilsynelatende riktig resultat?


Mvh Kåre Olai

Tom Ivar Helbekkmo

unread,
May 20, 2008, 1:13:27 PM5/20/08
to
Kåre Olai Lindbach <barb...@online.no> writes:

> Hei, lenge siden jeg har skrevet noe her nå!

Det har vært veldig stille i det hele tatt...

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

> [...]


> modul|dato|param3|param4
> 3|20080501|x1|y1
> 3|20080428|x5|y5
> 2|20080429|x2|y2
> 2|20080428|x3|y3
> 1|20080225|x4|y4

Du vil altså sortere slik at du lister opp alle data om hver modul
samlet, sortert etter nedadstigende dato, med rekkefølgen på modulene
etter nedadstigende største dato innen modulen?

Jeg tror du er ute etter noe slikt som dette:

SELECT m.modul, m.dato, m.param3, m.param4
FROM moduler AS m,
(SELECT modul, MAX(dato)
FROM moduler
GROUP BY modul) AS n (modul, maxdato)
WHERE m.modul = n.modul
ORDER BY n.maxdato DESC, m.modul, m.dato DESC;

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;

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

> [...]


> Er det riktig tenkt, eller gir det bare tilsynelatende riktig resultat?

Ingen av delene er jeg redd - det virket ikke for meg.

-tih
--
Self documenting code isn't. User application constraints don't. --Ed Prochak

Kåre Olai Lindbach

unread,
May 20, 2008, 4:05:10 PM5/20/08
to
Tom Ivar Helbekkmo skrev:

> Kåre Olai Lindbach <barb...@online.no> writes:
>
>> Hei, lenge siden jeg har skrevet noe her nå!
>
> Det har vært veldig stille i det hele tatt...

Hei igjen, Tom Ivar, lenge siden sist! Gammel
ND-maskin/Tandberg-terminal på kontoret ditt, osv.... ;-)

Jeg har også derfor akkurat gått over til "fienden" nå og meldt meg inn
i _web-forum_ (www.diskusjon.no - database). Ugh! Ingenting er lengre
som før... dessverre...

>> Jeg ønsker å få gruppert alle radene på en verdi ut fra maksverdien av
>> en annen i ett eneste sql-kall.
>> [...]
>> modul|dato|param3|param4
>> 3|20080501|x1|y1
>> 3|20080428|x5|y5
>> 2|20080429|x2|y2
>> 2|20080428|x3|y3
>> 1|20080225|x4|y4
>
> Du vil altså sortere slik at du lister opp alle data om hver modul
> samlet, sortert etter nedadstigende dato, med rekkefølgen på modulene
> etter nedadstigende største dato innen modulen?


Riktig!


> Jeg tror du er ute etter noe slikt som dette:
>
> SELECT m.modul, m.dato, m.param3, m.param4
> FROM moduler AS m,
> (SELECT modul, MAX(dato)
> FROM moduler
> GROUP BY modul) AS n (modul, maxdato)
> WHERE m.modul = n.modul
> ORDER BY n.maxdato DESC, m.modul, m.dato DESC;
>
> Dersom du har et produkt som ikke håndterer en SELECT i en FROM, kan du
> erstatte dette med et VIEW:

Jeg gikk for denne...


> 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;

Takker!

Hmmm, jeg har egentlig ett mer komplisert opplegg med en active-tabell
med tider, og JOIN mot en module-tabell med den egentlige sorter-ønskede
"module_ident", så jeg fikk ikke "SELECT .... FROM tabell,view" til å
virke. Sannsynligvis fordi knytningen mellom active (tabell) og
module-tabellen må settes opp før sort_active (view) kan knyttes til
samme module-tabell.

Så denne stemmer mer med mitt slutt-oppsett:

SELECT m.modul, m.dato, m.param3, m.param4
FROM moduler AS m

INNER JOIN nymodul AS n
ON m.modul = n.modul


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


>> Etter endel prøving og feiling satte jeg opp dette sql-kallet:
>> [...]
>> Er det riktig tenkt, eller gir det bare tilsynelatende riktig resultat?
>
> Ingen av delene er jeg redd - det virket ikke for meg.

Ugh! Beklager, mitt oppsett var noe forenklet iht det jeg testet ut,
burde ha lært for lenge siden at skrivebords-oppsett sjelden virker som
forutsatt! :-/

Takk for viktig innspill dog som førte til at jeg kom i mål, i allefall
så langt jeg har fått testet til nå!


Mvh Kåre Olai

0 new messages