Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL:为唯一id选择前N个条目并消除重复_Mysql_Sql_Select_Where Clause - Fatal编程技术网

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也没有,但这并不奇怪。