/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Give en row en relativ rank
Fra : Morten


Dato : 18-05-07 18:01


Hej. Jeg har en tabel hvor hver række har en score, der er beregnet ud
fra nogle af de andre attributter.

Denne score er absolut. Jeg vil i stedet hellere give rækken en relativ
rank, således hvis der er 10 rækker i tabellen, så er rank et tal fra 1
til 10 (hvor rækken med max score har rank 1).

Hvordan gør man det? Jeg tænkte først, at lave en AFTER UPDATE/INSERT
trigger, hvor jeg genberegner rank for samtlige rækker og opdaterer
disse, men det vil vel give problemer med muterende tabeller.

Nogen andre, kreative, forslag? En række skal gerne kende sin rank når
man henter den, så hvis jeg henter en enkelt række ud, skal dens rank i
det samlede billede følge med.

Mvh.

Morten

 
 
Morten (18-05-2007)
Kommentar
Fra : Morten


Dato : 18-05-07 18:52


> Hvordan gør man det? Jeg tænkte først, at lave en AFTER UPDATE/INSERT
> trigger, hvor jeg genberegner rank for samtlige rækker og opdaterer
> disse, men det vil vel give problemer med muterende tabeller.

Det kan man selvf. undgå ved at have en separat rankings tabel som man
vedligeholder i triggeren.

Troels Arvin (18-05-2007)
Kommentar
Fra : Troels Arvin


Dato : 18-05-07 20:27

On Fri, 18 May 2007 19:01:17 +0200, Morten wrote:
> Jeg har en tabel hvor hver række har en score, der er beregnet ud
> fra nogle af de andre attributter.
>
> Denne score er absolut. Jeg vil i stedet hellere give rækken en relativ
> rank, således hvis der er 10 rækker i tabellen, så er rank et tal fra 1
> til 10 (hvor rækken med max score har rank 1).

Visse SQL-implementationer har netop RANK() OVER:
http://troels.arvin.dk/db/rdbms/#select-top-n

> Hvordan gør man det? Jeg tænkte først, at lave en AFTER UPDATE/INSERT
> trigger, hvor jeg genberegner rank for samtlige rækker og opdaterer
> disse, men det vil vel give problemer med muterende tabeller.

Det lyder som noget, der hurtigt vil give problemer, hvis din applikation
begynder at få samtidige brugere.

--
Regards,
Troels Arvin <troels@arvin.dk>
http://troels.arvin.dk/

Morten (19-05-2007)
Kommentar
Fra : Morten


Dato : 19-05-07 10:19

Troels Arvin wrote:
> On Fri, 18 May 2007 19:01:17 +0200, Morten wrote:
>> Jeg har en tabel hvor hver række har en score, der er beregnet ud
>> fra nogle af de andre attributter.
>>
>> Denne score er absolut. Jeg vil i stedet hellere give rækken en relativ
>> rank, således hvis der er 10 rækker i tabellen, så er rank et tal fra 1
>> til 10 (hvor rækken med max score har rank 1).
>
> Visse SQL-implementationer har netop RANK() OVER:
> http://troels.arvin.dk/db/rdbms/#select-top-n

Det er smart, jeg må lige undersøge hvordan det forholder sig for MySQL,
og PostgreSQL.

>> Hvordan gør man det? Jeg tænkte først, at lave en AFTER UPDATE/INSERT
>> trigger, hvor jeg genberegner rank for samtlige rækker og opdaterer
>> disse, men det vil vel give problemer med muterende tabeller.
>
> Det lyder som noget, der hurtigt vil give problemer, hvis din applikation
> begynder at få samtidige brugere.

Du har sikkert ret, det bliver noget rod at skulle opdatere potentielt
tusindvis af records ved hver insert/update. Jeg overvejer om jeg er
bedre stillet ved at køre et job hver halve time, der beregner rank og
opdaterer et rankings table.

Morten



Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408182
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste