我在这里真的很棘手的SQL语句.尝试构建此查询大约一小时.也许你可以帮助我.
我们有一个包含3列的表:gamename | 用户| TIMES_PLAYED
查询应该选择前三个游戏(取决于总时间数量)和在此游戏中玩过多次的前三个用户=> 9行.
The result is like:
CounterStrike | Smith
CounterStrike | Jonny
Counterstrike | Hans
WoW | George
WoW | Bob
Wow | Frank
Need For Speed| James
Need For Speed| Marion
Need For Speed| Scarlet
Run Code Online (Sandbox Code Playgroud)
会很好,如果你能帮助我=)谢谢!
Qua*_*noi 13
更新:
正如所@Steve Kass指出的,我没有注意到你只想要前三场比赛.
这是更新版本:
在SQL Server,Oracle和PostgreSQL 8.4:
SELECT gamename, user
FROM (
SELECT r.gamename, user,
ROW_NUMBER() OVER (PARTITION BY game ORDER BY times_played DESC) rn,
FROM (
SELECT gamename, ROW_NUMBER() OVER (ORDER BY SUM(times_played) DESC) AS game_rn
FROM results
GROUP BY
gamename
) g
JOIN results r
ON r.gamename = g.gamename
WHERE game_rn <= 3
) q
WHERE rn <= 3
ORDER BY
gamename, times_played DESC
Run Code Online (Sandbox Code Playgroud)
在MySQL:
SELECT ro.gamename, ro.user
FROM (
SELECT gamename, SUM(times_played) AS rank
FROM results
ORDER BY
rank DESC
LIMIT 3
) rd
JOIN results ro
ON ro.gamename >= rd.gamename
AND ro.gamename <= rd.gamename
AND
(ro.times_played, ro.id) <=
(
SELECT ri.times_played, ri.id
FROM results ri
WHERE ri.gamename = rd.gamename
ORDER BY
ri.times_played DESC, ri.id DESC
LIMIT 2, 1
)
ORDER BY
gamename, times_played DESC
Run Code Online (Sandbox Code Playgroud)
PRIMARY KEY假设它被调用,您将需要一个for这个查询id.
我的博客在本文中对此进行了更详细的解释:
在PostgreSQL 8.3及以下:
SELECT gamename, ((ri)[s]).user
FROM (
SELECT gamename, ri, generate_series(1, 3) AS s
FROM (
SELECT ro.gamename,
ARRAY
(
SELECT ri
FROM results ri
WHERE ri.gamename = ro.gamename
ORDER BY
times_played DESC
LIMIT 3
) AS ri
FROM (
SELECT gamename, SUM(times_played) AS rank
FROM results
ORDER BY
rank DESC
LIMIT 3
) rd
) q
) q2
ORDER BY
gamename, s
Run Code Online (Sandbox Code Playgroud)