webForumDet fria alternativet

Top på gruppering

Databaser & SQLur Databashanterare & SQL

9 svar · 253 visningar · startad av Vide

Medlem 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

Medlem 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
Medlem 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å! :)

Medlem 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?

Medlem 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
Medlem 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
Medlem 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.

Medlem 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? ;)

Medlem 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.

Medlem 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
136 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)