我有这张桌子:
import caffe
net = caffe.Net('simple.prototxt', caffe.TEST)
net.params['conv1'][0].data[...] = w.reshape(96, 3, 11, 11) # set weights 1
net.params['conv1'][1].data[...] = b # set weights 2 (bias)
net.blobs['inp'].reshape(1, 3, 500, 500) # reshape input layer to fit our input array x
print(net.forward(inp=x.reshape(1, 3, 500, 500)).get('conv1'))
我想在两个排行榜上都获得player_id = 3的排名(leaderboard_id = 1和2)。
我尝试了许多选项,但均未成功,它们使我在排行榜1中排名1,在排行榜2中排名2,而这两个选项均应排在第一。
给出这些结果的最后代码是:
id leaderboard_id player_id score
1 1 3 5001
2 1 2 501
3 1 4 490
4 2 3 1001
5 2 2 110
...结果如下:
如果任何人都可以指出一个解决方案,将不胜感激。
谢谢
答案 0 :(得分:0)
在MySql 8中,您可以像这样使用window functions或ROW_NUMBER之类的DENSE_RANK。
在MySql 7中,您可以使用变量来模拟那些窗口函数。
在您的情况下,您需要每个排行榜的排名。
因此,需要检查排行榜是否已更改。
子查询中的ORDER BY
对于该计算确实很重要。
样本数据:
-- Test Table
drop table if exists test_leaderboards;
create table test_leaderboards (
id int primary key auto_increment,
leaderboard_id int not null,
player_id int not null,
score int not null
);
-- Sample Data
insert into test_leaderboards (leaderboard_id, player_id, score) values
(1, 3, 3333),
(1, 2, 2222),
(1, 4, 4444),
(2, 3, 3333),
(2, 2, 2222),
(2, 1, 1111);
查询:
SELECT leaderboard_id, player_id, score, rank
FROM
(
SELECT leaderboard_id, player_id, score,
CASE
WHEN leaderboard_id = @prev then @rank := @rank + 1
-- Remark: a variable assignement is always true
WHEN @prev := leaderboard_id then @rank := 1
END AS rank
FROM
(
SELECT leaderboard_id, player_id, score
FROM test_leaderboards
ORDER BY leaderboard_id ASC, score DESC
) data
CROSS JOIN (SELECT @rank := null, @prev := null) AS init
) r
WHERE player_id = 3;
结果:
leaderboard_id player_id score rank
-------------- --------- ----- ----
1 3 3333 2
2 3 3333 1