Mysql SQL:为唯一id选择前N个条目并消除重复
我有一张这样的桌子:Mysql SQL:为唯一id选择前N个条目并消除重复,mysql,sql,select,where-clause,Mysql,Sql,Select,Where Clause,我有一张这样的桌子: HorseID RiderID Total 121 1 2 5 1 150 600 1 20 30 2 500 5 3 10 600 3 10 34 3 10 SELECT DISTINCT Ho
HorseID RiderID Total
121 1 2
5 1 150
600 1 20
30 2 500
5 3 10
600 3 10
34 3 10
SELECT DISTINCT HorseID
FROM (SELECT HorseID, RiderID, Total,
@num := IF(@group = RiderID, @num + 1, 1) AS row_number,
@group := RiderID AS group
FROM UnnamedTable
ORDER BY RiderID, Total DESC, HorseID) ranked
WHERE row_number <= 2;
每匹马可能有多个骑手,反之亦然“总数”指骑手和马匹同时发生的事故总数。我想要的是一个表,其中每个车手的总马力前2名,消除重复。也就是说,骑手1的头号马是马5,因为他们总共有150次事故,而骑手1的其他马分别有20次和2次事故。因此,我希望这里的输出是:
HorseID
5
600
30
注意:当一名骑手的马数少于2匹时,它应该抓住最上面的1匹。当谈到第3条时,有一个平局,因此它在顺序上选择了前2条-但是,这些已经在列表中,因此没有添加重复数据消除部分-如果速度更快,也很乐意在后面的单独步骤中进行重复数据消除。我不介意它在平局中抢到34号,所以我们在名单上有一个额外的horseid,任何解决平局的方法都可以
这是一个玩具数据集,真正的数据集要大得多,我将为每个RiderID抓取前200个,因此一个可扩展/高效的解决方案将是非常好的
我该怎么做呢?这只是一个稍加修改的问题。MySQL并不是最好的,因为它缺乏分析功能,但你可以这样做:
HorseID RiderID Total
121 1 2
5 1 150
600 1 20
30 2 500
5 3 10
600 3 10
34 3 10
SELECT DISTINCT HorseID
FROM (SELECT HorseID, RiderID, Total,
@num := IF(@group = RiderID, @num + 1, 1) AS row_number,
@group := RiderID AS group
FROM UnnamedTable
ORDER BY RiderID, Total DESC, HorseID) ranked
WHERE row_number <= 2;
注意,这不适用于领带。如果前三匹马总共有200匹,你仍然只能得到两排。请注意,子查询的orderby中的第三项是HorseID。这只是为了在平局的情况下使结果具有确定性。您可以通过向IF表达式添加一点逻辑并将其从like更改为like来处理关系。如果你想让它变成这样,我想你需要第三个变量
我也不确定这个比例有多大。你需要更好地解释上半部分。在你的脑海里没有出现在屏幕上。然后,你需要展示你的代码,你已经尝试过了。最后,你把所有的甲骨文都放在我们身上了。另外,你忘了初始化你的variables@StrawberryOracle、Postgres、SQL Server、DB2、Sybase、Firebird、Informix。许多RDBMS支持分析函数。MySQL不这样做有些不寻常。SQLite也没有,但这并不奇怪。