Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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-按行的底部(X)百分比限制_Mysql_Sql_Sql Limit - Fatal编程技术网

MySQL-按行的底部(X)百分比限制

MySQL-按行的底部(X)百分比限制,mysql,sql,sql-limit,Mysql,Sql,Sql Limit,以下是我的表格结构: +-------+--------+----------+ | item | price | quantity | +-------+--------+----------+ | 22452 | 579150 | 4 | | 34664 | 334425 | 7 | | 32249 | 204750 | 3 | | 39970 | 97500 | 5 | | 36907 | 116415 | 6 |

以下是我的表格结构:

+-------+--------+----------+
| item  | price  | quantity |
+-------+--------+----------+
| 22452 | 579150 |        4 |
| 34664 | 334425 |        7 |
| 32249 | 204750 |        3 |
| 39970 |  97500 |        5 |
| 36907 | 116415 |        6 |
|  4338 | 207451 |       17 |
| 23425 | 388050 |        4 |
| 23427 | 532350 |       14 |
| 76080 | 180000 |        6 |
| 76076 | 400000 |        4 |
+-------+--------+----------+
项目不是唯一的,每个项目可能有1到几千行,所以我按项目对结果进行分组。我当前的查询如下:

SELECT  item AS id,
        COUNT(item) as total,
        ROUND(AVG(price/quantity)) AS mean,
        ROUND(MIN(price/quantity)) AS cheapest
FROM `data`
GROUP BY item;
除了这4个结果之外,我还想计算
(价格/数量)
值(不是<0.15*MAX(价格/数量),而是0.15*total,由(价格/数量)ASC订购)行底部15%的平均价格。我想到的解决方案涉及使用该项的计数作为限制器的临时表,但如果可能的话,我非常希望它是单个查询。我肯定这里需要一个子查询,但我不确定如何获取特定项的计数,然后将结果限制在15%

用下面的答案更新 使用下面的@GordonLinoff答案基本上让我一路走到了那里。然而,我确实遇到了两个问题。最大的一个问题是@rn变量没有重置,这导致它保持增量,随后只包含第一行项目。第二个是表中出现次数的15%小于1的任何项目,返回NULL。更正很小,我在下面列出了我使用的最后一个查询:

SELECT item AS id,
       COUNT(item) as total,
       ROUND(AVG(price/quantity)) AS mean,
       ROUND(MIN(price/quantity)) AS cheapest,
       ROUND(avg(case when rn <= IF(cnt * 0.15 < 1, cnt, cnt * 0.15) then price/quantity end)) as Cheapest15Percent 
FROM
    (SELECT d.*, cnt, IF(@item = d.item, @rn := @rn + 1, if(@item := d.item, @rn := 1, 1)) as rn
    FROM `data` d LEFT JOIN
        (SELECT item, COUNT(*) cnt FROM `udata` GROUP BY item) di
    ON d.item = di.item CROSS JOIN
       (SELECT @rn := 0, @item := -1) vars
    ORDER BY d.item, d.price/d.quantity) d
GROUP BY d.item;
选择项目作为id,
将(项目)计为总计,
四舍五入(平均值(价格/数量))作为平均值,
四舍五入(最低(价格/数量))为最便宜,

四舍五入(平均值)(rn时的情况)这假设您想要每个项目最便宜15%的平均值

以下查询枚举每个项目的行并获取总行数:

  select d.*, cnt,
         if(@item = item, @rn := @rn + 1, if(@item := item, 1, 1)) as rn
  from `data` d left join
       (select item, count(*) cnt
        from data
        group by item
       ) di
       on d.item = di.item cross join
       (select @rn := 0, @item := -1) vars
  order by item, price/quantity;
然后,基本上可以将其插入查询并进行条件聚合:

SELECT item AS id,
       COUNT(item) as total,
       ROUND(AVG(price/quantity)) AS mean,
       ROUND(MIN(price/quantity)) AS cheapest,
       avg(case when rn <= cnt * 0.15 then price/quantity end) as Cheapest15Percent
FROM (select d.*, cnt,
             if(@item = item, @rn := @rn + 1, if(@item := item, 1, 1)) as rn
      from `data` d left join
           (select item, count(*) cnt
            from data
            group by item
           ) di
           on d.item = di.item cross join
           (select @rn := 0, @item := -1) vars
      order by item, price/quantity
     ) d
GROUP BY item;
选择项目作为id,
将(项目)计为总计,
四舍五入(平均值(价格/数量))作为平均值,
四舍五入(最低(价格/数量))为最便宜,

AVN(如果你喜欢RN的话,考虑下面这个简单的两步过程:1。如果你还没有这样做(你没有),提供适当的DDL(和/或SqLFIDLE)。因此,我们可以更轻松地复制问题。2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。可能的重复?您希望每个项目都有此结果?还是聚合后的表?@GordonLinoff每个项目。我想获得项目在“数据”中出现的次数。如果项目1234出现100次,我想按(价格/数量)ASC对该项目进行排序,然后获得前15行(100*0.15)的(价格/数量)平均值。查询没有按原样运行。我假设“from dat”应该是“from
data
”,我还必须标记最顶端的列。(d.Item、d.price等)结果很接近。但当特定项目的行数为空时,最便宜的15%返回NULL