Avatar billede romme Nybegynder
03. oktober 2005 - 13:36 Der er 21 kommentarer

Hvilken placering på listen?

Jeg har en tabel hvor der gemmes stemmer på brugere.
For at lave en topliste har jeg følgende sql.

SELECT sum(point) AS total, userid FROM votes GROUP BY userid ORDER BY total

Dette giver en sorteret liste over antal stemmer på alle brugere.

Men hvordan finder jeg ud af hvilken placering userid X har?
Avatar billede beef12 Nybegynder
03. oktober 2005 - 13:50 #1
Du bruger vel ikke tilfældigvis sql server 2005?
For så er der kommet en lækkker lille funktion ved navn rank()

Jeg har lavet en rank sql-select til sql server 2000, men den ligger derhjemme. Så jeg kan sende den i aften hvis du ikke anvender 2005
Avatar billede romme Nybegynder
03. oktober 2005 - 13:58 #2
Det køre på en SQL 2000.
Avatar billede beef12 Nybegynder
03. oktober 2005 - 14:09 #3
Her er et forsøg - den er lavet meget hurtigt, så den er sikkert sprængfyldt med syntaksfejl. Men det er principielt det du skal gå efter for at lave en ranking select i sqlserver 2000:


select b.RANK as Rank,
a.*
from votes a
left outer join
(
select
count(*) as RANK,
a1.user_id,
a1.point,
from votes a1,
votes a2
where
a1.point>=
a2.point
group by a1.user_id
) as b

on a.user_id= b.user_id
Avatar billede romme Nybegynder
03. oktober 2005 - 14:47 #4
Jeg kan ikke helt få den til at virke som den skal.

Mit udtræk ender ud i f.eks.:

Point  Userid
60      1067
41    1322
34    1066
30    15
20    883

Jeg vil så f.eks. gerne vide hvilket nummer userid 15 ligger.
Avatar billede beef12 Nybegynder
03. oktober 2005 - 15:12 #5
Her, der var et par fejl i, som nu er rettet:


select b.RANK as Rank,
a.*
from votes a
left outer join
(
select
count(*) as RANK,
a1.userid
from votes a1,
votes a2
where
a1.point>=
a2.point
group by a1.point
) as b

on a.userid= b.userid
Avatar billede romme Nybegynder
03. oktober 2005 - 15:38 #6
Hmmm, det virker stadigvæk ikke.

Tabellen ser således ud:

VotesID;UserID;Point;InID;AddDateTime
4;1233;1;30082882;2005-09-15 11:55:30.933
8;1066;10;30364814;2005-09-28 16:03:22.153
9;1066;1;30364928;2005-09-28 16:06:07.153
10;1066;1;30367110;2005-09-28 17:08:54.200
11;1322;1;30370636;2005-09-28 19:21:00.420
12;1066;1;30378522;2005-09-29 09:52:57.513
13;1066;1;30379972;2005-09-29 11:36:00.387
14;1152;10;30393012;2005-09-29 21:14:54.483
15;1067;10;30400732;2005-09-30 10:25:42.043
16;1067;10;30400916;2005-09-30 10:38:21.847
....
....
....

Håber det kan hjælpe.
Avatar billede beef12 Nybegynder
03. oktober 2005 - 15:39 #7
hvad er fejl-beskeden?
Avatar billede beef12 Nybegynder
03. oktober 2005 - 15:41 #8
og du tilpasser naturligvis dine tabel og kolonne navne så de passer med din database, ikke?
Feks omdøber userid til UserID ?
Avatar billede romme Nybegynder
03. oktober 2005 - 15:43 #9
Column 'a1.userid' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Avatar billede beef12 Nybegynder
03. oktober 2005 - 15:45 #10
øhhh - jeg spørger igen ;-)

"og du tilpasser naturligvis dine tabel og kolonne navne så de passer med din database, ikke?
Feks omdøber userid til UserID ?"
Avatar billede romme Nybegynder
03. oktober 2005 - 18:31 #11
Jo, felterne hedder det rigtige, men det er korrekt at 'a1.userid' ikke findes i group by clause.
Avatar billede beef12 Nybegynder
03. oktober 2005 - 19:22 #12
jo, men den hedder jo UserID.

Send mig lige den sql som du har fyret af.
Avatar billede romme Nybegynder
03. oktober 2005 - 20:54 #13
Er det ikke lige meget om det er userid eller UserID ?
Jeg har aldrig oplevet at Quety Analyzer eller MS SQL er tager højde for case, men jeg har prøvet at rettet og fejlen er stadigvæk den samme.
Avatar billede beef12 Nybegynder
03. oktober 2005 - 21:17 #14
Okay - det afhænger af opsætning. Send mig lige det sql du har fyret af.
Avatar billede romme Nybegynder
03. oktober 2005 - 21:40 #15
select b.RANK as Rank, a.* from votes a
left outer join
(
select count(*) as RANK, a1.UserID from votes a1, votes a2 where a1.point>= a2.point group by a1.point
) as b
on a.UserID= b.UserID
Avatar billede beef12 Nybegynder
03. oktober 2005 - 21:50 #16
sådan her:


select b.RANK as Rank, a.* from votes a
left outer join
(
select count(*) as RANK, a1.UserID from votes a1, votes a2 where a1.point>= a2.point group by a1.userid
) as b
on a.UserID= b.UserID
Avatar billede romme Nybegynder
03. oktober 2005 - 23:33 #17
Hmm, det giver ikke en liste med en ranking fra 1 til x antal, men i stil med dette.

Rank;VotesID;UserID;Point;InID;AddDateTime
7;4;1233;1;30082882;2005-09-15 11:55:30.933
121;8;1066;10;30364814;2005-09-28 16:03:22.153
121;9;1066;1;30364928;2005-09-28 16:06:07.153
121;10;1066;1;30367110;2005-09-28 17:08:54.200
131;11;1322;1;30370636;2005-09-28 19:21:00.420
121;12;1066;1;30378522;2005-09-29 09:52:57.513
121;13;1066;1;30379972;2005-09-29 11:36:00.387
31;14;1152;10;30393012;2005-09-29 21:14:54.483
186;15;1067;10;30400732;2005-09-30 10:25:42.043
....
....
....

Det skulle gerne ende ud i noget a la:

rank;total;userid
1;60;1067
2;41;1322
3;34;1066
4;20;883
5;20;1203
6;10;1264
7;10;1271
8;10;965
....
....
....

Så man kan finde ud af hvilken placering f.eks. userid 1066 har (rank 3).
Avatar billede beef12 Nybegynder
04. oktober 2005 - 07:35 #18
så ved jeg ikke hvad der går galt. Virker fint her på min server.
Avatar billede romme Nybegynder
04. oktober 2005 - 09:23 #19
Hvilken SQL server køre du med?
Avatar billede beef12 Nybegynder
04. oktober 2005 - 14:34 #20
2000 og 2005.
Jeg har oprettet en lille test tabel med nogle test-værdier og der virker rangerering fint.
Send evt. et create table script, så kan jeg prøve med en kopi af din tabel.
Avatar billede beef12 Nybegynder
14. oktober 2005 - 15:12 #21
Nu brugte den der rank algoritme som jeg posede d. 03/10-2005 15:12:14 til en af mine egne opgaver jeg sidder med p.t. på en mssql 2000 og det virkede nu altså fint.

Mon ikke du bare har en dum lille syntaks fejl et eller andet sted.
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