作为序言,似乎我们的服务器运行5.5.56-MariaDB。
例如,我目前处于可以返回如下数据的位置:
数据_ | _数量00001 | 100000001 | 90000001 | 80000001 | 70000002 | 60000002 | 50000002 | 40000003 | 30000003 | 20000003 | 100
使用其他表中的组,计数和联接可以很容易地提取数据和数量值。但是,我试图仅从提取的每个数据中返回两个最高数量的值-因此,实际上,我希望结果更像这样:
数据_ | _数量00001 | 100000001 | 90000002 | 60000002 | 50000003 | 30000003 | 200
这些值没有改变,我只是不返回与我无关的数据。我一直在摆弄嵌套表,计数和组以及其他我能想到的东西,但是我最近来的只是返回最高的值,这不符合我的需求。
我对如何继续此处感到非常困惑,我似乎无法找到其他需要类似数据回报率的人,因此,如果有人可以提供任何指导,我将不胜感激它。
非常感谢。
如果您使用的是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