Avatar billede ae03 Novice
18. juni 2010 - 10:18 Der er 4 kommentarer og
1 løsning

Aggregeret resultat for unikke personer

Jeg skal bruge nogle aggregerede resultater (count og avg) baseret på det seneste måleresultat for hver person i en tabel. De enkelte poster har ikke unikke ID. Tabellen rummer følgende rækker af relevans for beregningen:

ID(int)        personID. Hver person må kun være med 1 gang i resultatet. Controlleres med count().
BMI(decimal)  de måledata, der skal beregnes avg for
BY(varchar)    fødselsår. Skal kun bruge årgang 94
RY(int)        registreringsår. Skal bruge målinger fra 2009
Rtid(decimal)  decimalværdi af registreringstid

For nogle ID er der flere registreringer af BMI. Jeg vil kun ha' den nyeste med i beregningerne. Jeg kan godt oprette en kolonne med unik ID til hver række, hvis det hjælper, men jeg vil helst være fri.
Avatar billede ae03 Novice
18. juni 2010 - 11:37 #1
Har selv løst problemet.
18. juni 2010 - 11:45 #2
Til lykke med det.  Men saa burde du egenlig vise loesningen saa den er til raadighed for fremtidige brugere med et lignende problem.
Avatar billede ae03 Novice
18. juni 2010 - 12:41 #3
Det er jo rigtigt. Det er ikke løst helt optimalt, idet jeg ikke tager den nyeste registrering men bare en registrering med for hver. Det er imidlertid ikke kritisk, så det kører jeg med, da jeg skal have en masse kørsler klaret i dag.

Løsningen er baseret på en tidligere løsning her fra Eksperten.dk (-ramad- på http://www.eksperten.dk/spm/746866), men jeg havde problemer med at få den til at spille, da jeg postede mit spm.

CREATE TABLE #tabelA(ID int, BMI decimal(9,2))

INSERT INTO #tabelA(ID)
SELECT DISTINCT ID
FROM tabelB
WHERE RY = 2009 AND BY = 94

UPDATE #unik_ID_midlertidig
SET BMI = b.BMI
FROM tabelA a INNER JOIN
    TabelB b
ON a.ID = b.ID

SELECT count(ID), avg(BMI)
FROM tabelA

DROP TABLE tabelA
Avatar billede Syska Mester
24. juni 2010 - 23:39 #4
Da du ikke bruger din temp table til noget specielt kan du jo også gøre sådan her:

SELECT COUNT(ID), AVG(BMI)
FROM tabelA a INNER JOIN
(
SELECT DISTINCT ID
FROM tabelB
WHERE RY = 2009 AND BY = 94
) AS b
ON a.ID = b.ID

mvh
Avatar billede ae03 Novice
25. juni 2010 - 08:28 #5
Ja, det er jo nok sådan, den skal skæres en anden gang. Jeg havde gang i en del formuleringer af samme type, men jeg overså at forsøge med INNER JOIN.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester