webForumDet fria alternativet

Top på gruppering

Databaser & SQLur Databashanterare & SQL

9 svar · 253 visningar · startad av Vide

Vides avatarVideMedlem sedan dec. 19998 577 inlägg
Frågan#1

Hejsan,

Har en tabell där jag lagrar statistik för frisbeegolf.

Kolumnen player innehåller ett id som representerar vilken spelare som har resultatet.

Kolumnen score är värdet för ett specifikt "hål", varav SUM ger totalen den rundan.

Kolumnen roundid är vilken runda som spelats.

Jag vill nu ha ut vem som vunnit rundan, vilken player och vilken sumscore denne fick, samt få ut roundid samtidigt.

Min nuvarande SQL-sats ser ut såhär:

SELECT player, SUM(score) AS sumscore, roundid
FROM stats
GROUP BY roundid, player
ORDER BY roundid DESC, sumscore DESC

Men eftersom jag måste gruppera på player så får jag ju ut alla spelare, jag vill bara den som har lägst sumscore.

Mvh, Vide

juventus1Medlem sedan dec. 2000399 inlägg
#2
SELECT player, SUM(score) AS sumscore, roundid
FROM stats
GROUP BY roundid, player
HAVING MIN(score)
ORDER BY roundid DESC, sumscore DESC
Vides avatarVideMedlem sedan dec. 19998 577 inlägg
#3

Det fungerar inte, grejjen är att det är 9 eller 18 hål, alltså 9 eller 18 poster per player och roundid.

Tack ändå! :)

LarsGMedlem sedan dec. 200012 464 inlägg
#4
SELECT player, SUM(score) AS sumscore, roundid
FROM stats as s
GROUP BY roundid, player
having sum(score) = (select max(s) 
    from (select sum(score) as s 
            from stats 
           where roundid = s.roundid)dt)
ORDER BY roundid DESC

Vad har 9 eller 18 hål för betydelse?

Vides avatarVideMedlem sedan dec. 19998 577 inlägg
#5

Nu får jag bara en post ur SQL-satsen, jag skulle vilja ha alla unika roundid med så att man får vinnaren i varje runda så att säga.

Skillnaden mellan 9 och 18 är bara antalet poster, så egentligen spelar det inte någon roll här.

player	score	roundid	hole
1	3	1	1
2	3	1	1
1	2	1	2
2	2	1	2
1	3	1	3
1	3	1	4
1	3	2	1
1	2	2	2
1	3	2	3
1	3	2	4
o.s.v
LarsGMedlem sedan dec. 200012 464 inlägg
#6

Hmm, jag tycker att min förra borde fungera ...

select player, roundid, sum(score) 
       from stats s
   where (select sum(score) from stats 
         where player = s.player
           and round = s.roundid) >=
         (select sum(score) from stats 
         where round = s.roundid)
  group by player,roundid
Vides avatarVideMedlem sedan dec. 19998 577 inlägg
#7

Skumt detta, jag får fortfarande bara ut enda post.

Ändrar jag operatorn till < så får jag alla, > ger inga träffar och = ger bara en.

LarsGMedlem sedan dec. 200012 464 inlägg
#8
select player,roundid,s
  from (
    select player, roundid, sum(score) s
      from stats) dt
     where s = (select max(s) 
                 from (select player, roundid, sum(score) s
                         from stats) x
                where roundid = dt.roundid)

Det finns väl mer än en runda inlagd? ;)

Vides avatarVideMedlem sedan dec. 19998 577 inlägg
#9

Den fungerade som tänkt. Tackar. :)

Dock tar det längre tid än vad som kan tänkas rimligt (typ 15 sekunder).

Skall testa att göra en SP av den och om det hjälper.

Vides avatarVideMedlem sedan dec. 19998 577 inlägg
#10

Det hjälpte inte att göra en SP av den, och kollar man på CPU-belastningen så drar sql-server fullt när man kör frågan.

Jag har lagt till filter i den för att lättare testa, finns det något sätt att göra den prestandamässigt CPU-snålare?

CREATE PROCEDURE spGetWins
@intCid int,
@intUid int
AS
select count(*) as wins from
(
SELECT s as wins, player, roundid, course
FROM (SELECT player, roundid, SUM(score) s, course
      FROM stats
      GROUP BY player, roundid, course) dt
WHERE s =
        (SELECT MIN(s)
      FROM (SELECT player, roundid, SUM(score) s
            FROM stats
            GROUP BY player, roundid, course) x
      WHERE roundid = dt.roundid)
and player = @intUid and course = @intCid
) y
124 ms totalt · 3 externa anrop · v20260731065814-full.58439ac5
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
122 ms — hämta tråd, inlägg och bilagor (db)