Miltäs tämä näyttää:Tulee hidas siksi että tiimit lisätään ennen summausta. Lisäksi jos nykyisellä tiimillä enddate on null niin tuolla yllä olevalla saat kaikki muut paitsi nykyisen.
Eli jos ymmärsin oikein niin enddate is null olisi oikea ehto, silloin joinin ei pitäisi lisätä rivimäärää olettaen että voi kuulua kerrallaan vain yhteen tiimiin.
Saattaa toimia silti paremmin niin että pidät alkuperäisen kyselyn ennallaan (summat pelaajittain) ja liität sen kylkeen muut tiedot jolloin ruvejä on enää 1 per pelaaja.
Jos rivejä on paljon niin join ja ehtosarakkeille kannattaa tehdä indeksit.
Samoin jos sisäkkäisiä kyselyjä tulee paljon niin näkymät auttavat, ei tehossa mutta selkeyttää.
SQL:
SELECT
"Player"."id",
"Player"."lastName",
"Team"."name",
"PlayerStats"."goals",
"PlayerStats"."assists"
FROM
(
SELECT
"Player"."id",
SUM("Stats"."goals") AS "goals",
SUM("Stats"."assists") AS "assists"
FROM
"Player"
INNER JOIN (
SELECT
"GameStats"."playerId" AS "playerId",
"GameStats"."goals" AS "goals",
"GameStats"."assists" AS "assists",
ROW_NUMBER() OVER (
PARTITION BY "GameStats"."playerId"
ORDER BY
"Game"."gameDate" DESC
) AS "seqnum"
FROM
"Game"
JOIN "GameStats" ON (
"Game"."id" = "GameStats"."gameId"
)
) "Stats" ON (
"Player"."id" = "Stats"."playerId"
)
WHERE
"Stats"."seqnum" < 6
GROUP BY
"Player"."id"
) AS "PlayerStats"
JOIN "Player" ON "PlayerStats"."id" = "Player"."id"
JOIN "PlayerTeam" ON "Player"."id" = "PlayerTeam"."playerId"
JOIN "Team" ON "PlayerTeam"."teamId" = "Team"."id"
WHERE
"PlayerTeam"."endDate" IS NULL
Nyt tämä toimii hyvin pitkälti niin kuin haluankin. Pystyn Player-taulukon relaatioita joinailemaan tilastojen laskennan jälkeen miten haluan.
Mietityttää tuo WHERE ehto. Joinaan PlayerTeam taulukkoon kaikki joukkueet. Tapahtuuko tuossa nyt niin, että joinaan myös se joukkueet, joissa endDate ei ole null ja filtteröinti tapahtuu vasta lopputuloksesta, vai tajuaako tietokanta automaattisesti olla joinaamatta niitä rivejä, jotka WHERE-lauseke sulkee pois?