有没有一种方法可以限制表中返回唯一值的次数?

作为序言,似乎我们的服务器运行5.5.56-MariaDB。

例如,我目前处于可以返回如下数据的位置:

数据_ | _数量
00001 | 1000
00001 | 900
00001 | 800
00001 | 700
00002 | 600
00002 | 500
00002 | 400
00003 | 300
00003 | 200
00003 | 100

使用其他表中的“组”,“计数”和“联接”可以很容易地提取“数据”和“数量”值。但是,我试图仅从提取的每个数据中返回两个最高数量的值-因此,实际上,我希望结果更像这样:

数据_ | _数量
00001 | 1000
00001 | 900
00002 | 600
00002 | 500
00003 | 300
00003 | 200

值没有改变,我只是不返回与我无关的数据。 我一直在摆弄嵌套表,计数和组以及其他任何我能想到的东西,但是我所遇到的最接近的结果只是返回最高值,这不符合我的需求。

我对如何继续此处感到非常困惑,而且我似乎找不到其他需要类似数据回报率的人,因此,如果有人可以提供任何指导,我将欣赏它。

非常感谢。

a349158555 回答:有没有一种方法可以限制表中返回唯一值的次数?

如果您使用的是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

大家都在问