如果您使用的是MySQL 8+,则可以在此处使用ROW_NUMBER
:
SELECT Data,Quantity
FROM
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY Data ORDER BY Quantity DESC) rn
FROM yourTable
) t
WHERE
rn <= 2
ORDER BY
Data,Quantity DESC;
在早期版本的MySQL上,可以使用用户变量来模拟行号,但是需要更多代码。如果您长期需要此类查询,请考虑升级。
,
https://en.wikibooks.org/wiki/Structured_Query_Language/Retrieve_Top_N_Rows_per_Group有几个示例,说明了如何实现。
在很久以前的一个用例中,我使用了以下形式的查询
SELECT *
FROM table_temp
WHERE quantity = (SELECT Max(quantity)
FROM table_temp AS t
WHERE t.data = table_temp.data)
OR quantity = (SELECT Max(quantity)
FROM table_temp AS t
WHERE t.data = table_temp.data
AND quantity < (SELECT Max(quantity)
FROM table_temp AS t2
WHERE t2.data = table_temp.data))
这将选择组中的最高数量,并且该组中的下一个值很好。
第一个质量合格的过滤器将一个组中的最大值拉出,第二个过滤条件将第二个过滤器中的最大值拉出
Tim Biegeleisen提出的解决方案更为优雅,因为它可以扩展为任意数量的值,而在SQL中却没有太多复杂性。
相同的SQL Fiddle:http://sqlfiddle.com/#!9/372454/8
,
如果只是查询,您可以尝试这样的操作
SELECT
T.Data,T.Quantity
From
(
SELECT
Data,Quantity,if(@id = TT0.data,(select(@i := @i + 1)),(select(@i := 0))) as R,-- if previous id == data then row +1 else r=0
@id := TT0.data -- assign Data to @id variable
FROM
YourTable as T0,(select @i:= 0,@id := null ) as Rows -- cross join initialise @i and @id
) AS T
WHERE
T.R < 2; -- row numbers you are interested in
有关限制和更多信息:https://dev.mysql.com/doc/refman/5.7/en/user-variables.html
本文链接:https://www.f2er.com/3029735.html