Avatar billede Motjida Novice
03. maj 2013 - 10:15 Der er 8 kommentarer og
1 løsning

Eliminering af data

Hej Eksperter.

Jeg har en tabel i en MS Access database hvor jeg har f¢lgende kolonner:

Afdeling1
Afdeling2
Bel¢b1
Bel¢b2
Bel¢b3

Eksempel data for denne tabel er:

Nyborg | Odense | 25,75 | 33,50 | 50,00
Esbjerg | Herlev | 32,44 | 19,50 | 23,75
Odense | Nyborg | -25,75 | -33,50 | -50,00
Aarhus | K¢benhavn | 90,21 | 45,77 | 19,00
Herlev | Esbjerg | -32,44 | -19,50 | -23,75


Som i kan se nar nogle af linierne 2 ben (f.eks. Odense - Nyborg), men nogle her kun 1 ben (f.eks. Aarhus - K¢benhavn)

Jeg skal lave en foresp¢rgsel som filtrerer ovenstående data, og giver mig f¢lgende resultat:

Nyborg | Odense | 25,75 | 33,50 | 50,00
Esbjerg | Herlev | 32,44 | 19,50 | 23,75
Aarhus | K¢benhavn | 90,21 | 45,77 | 19,00

Dvs. hvis der er 2 ben, skal kun det f¢rste ben vises.

Har kæmpet med det i et stykke tid, og kan ikke helt overskue det, kanske jeg ikke kan se skoven for bare træer. Håber i kan hjælpe.

Hvis i mangler mere information skal i endelig sp¢rge.
Avatar billede terry Ekspert
03. maj 2013 - 11:22 #1
is the second leg always minus values? If so then you could for that
Avatar billede Motjida Novice
03. maj 2013 - 12:01 #2
Nope det er det ikke :(
Avatar billede fdata Forsker
04. maj 2013 - 15:01 #3
Du kunne bruge en flertrinsraket:

Opret først en forespørgsel "Q_Afd", der opretter en nøgle ud fra de to byer.

SELECT Afd.*, IIf([Afdeling1]<[Afdeling2],[Afdeling1],[Afdeling2]) & "-" & IIf([Afdeling1]>=[Afdeling2],[Afdeling1],[Afdeling2]) AS A
FROM Afd;

Lav så en ny forespørgsel, der finder den første (og her er "første" defineret som posten med det laveste ID):

SELECT Min(Q_Afd.ID) AS MinOfID, First(Q_Afd.Afdeling1) AS FørsteOfAfdeling1, First(Q_Afd.Afdeling2) AS FørsteOfAfdeling2, First(Q_Afd.Beløb1) AS FørsteOfBeløb1, First(Q_Afd.Beløb2) AS FørsteOfBeløb2, First(Q_Afd.Beløb3) AS FørsteOfBeløb3, Q_Afd.A
FROM Q_Afd
GROUP BY Q_Afd.A
ORDER BY Min(Q_Afd.ID);

Tjek den i Designvisning. Så ser det lidt mere overskueligt ud :O)
Avatar billede Slettet bruger
05. maj 2013 - 14:00 #4
Sjovt så forskellig det kan løses - her udnyttes eksklusion af der hvor afdeling1 er lig afdeling2 ved sammenligning af 2 poster.

select * from afd where not id in ( SELECT s.id from afd as s inner join afd as c on s.afdeling1=c.afdeling2 and s.id>c.id)
Avatar billede Motjida Novice
13. maj 2013 - 09:38 #5
fdata, mange tak for din l¢sning, den ser ud til at virke fint.

brugerekspert, din l¢sning udelod en masse linier som burde være med i output.
Avatar billede Slettet bruger
13. maj 2013 - 12:15 #6
De udeladte er bypar som 'nyborg horbro' der ikke har en 'horbro nyborg' makker, men hvor en af byerne forkommer i et andet par der optrædder med begge rækkefølger som i 'nyborg odense','odense nyborg'.
Det oplagt at join nøglen i selvjoinen skal være:

s.afdeling1=c.afdeling2 and s.afdeling2=c.afdeling1 and s.id>c.id
Avatar billede Motjida Novice
13. maj 2013 - 14:22 #7
hej brugerekspert,

ovenstående ændring hjalp en del, dog tager foresp¢rgslen meget lang tid at eksekvere (30+ sekunder)

Derudover er antallet af records ikke konsistent, nogle gange lander foresp¢rgslen på 2383 (som er korrekt), men oftest er det 2382, 2381 eller noget helt andet.
Avatar billede Motjida Novice
13. maj 2013 - 14:32 #8
Hej igen,

Tror det var mig der dummede mig lidt,  havde glemt at g¢re ID til PrimaryKey, så det gjorde både at foresp¢rgslen tog lang tid og at den var inkonsistent.

Ser ud til at virke fint nu
Avatar billede Slettet bruger
13. maj 2013 - 19:25 #9
Ja, et indeks på ID, som vist skabes automatisk når den gøres til primary key, gør en væsentlig forskel når der skal sammenlignes om en værdi af id er mindre end en anden.
fdata's er nok hurtigere for stort postantal da antallet af mellemresultat poster der, forholder sig linært til antallet af poster, hvorimod selfjoinen giver kvadatet på antallet af poster evalueringer af joinnøglen til udvælgelse.

Så fik vi beriget forummet med 2 løsninger.
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

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