是否有办法限制表中返回唯一值的次数?

问题描述 投票:0回答:3

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

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

数据_ | _数量00001 | 100000001 | 90000001 | 80000001 | 70000002 | 60000002 | 50000002 | 40000003 | 30000003 | 20000003 | 100

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

数据_ | _数量00001 | 100000001 | 90000002 | 60000002 | 50000003 | 30000003 | 200

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

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

非常感谢。

mysql mariadb greatest-n-per-group
3个回答
1
投票

如果您使用的是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上,可以使用用户变量来模拟行号,但是需要更多代码。如果您长期需要此类查询,请考虑升级。


0
投票

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


0
投票

如果只是查询,您可以尝试这样的操作

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

© www.soinside.com 2019 - 2024. All rights reserved.