【问题标题】:SQL MIN(COUNT) does not seem to be working properly?SQL MIN(COUNT) 似乎无法正常工作?
【发布时间】:2019-05-16 05:29:55
【问题描述】:

首先,我从以下查询生成了一个表:

select su.supplier_zip, sp.shop_zip, COUNT(p.ptypes) 
from supplier su 
inner join parts p on su.sid=p.sid 
inner join sales s on p.parts_pid=s.pid 
inner join shop sp on s.shop_id=sp.shop_id 
group by sp.shop_zip, su.supplier_zip 
order by su.supplier_zip;

+--------------+----------+-----------------+
| supplier_zip | shop_zip | COUNT(p.ptypes) |
+--------------+----------+-----------------+
|         7733 |    85254 |               6 |
|         7733 |    33603 |               2 |
|         7733 |    92821 |               7 |
|         7733 |    95070 |               2 |
|         7733 |    94010 |               5 |
|         7733 |    68154 |               6 |
|         7733 |    45277 |               4 |
|         7733 |    94568 |               3 |
|         7733 |    55401 |               3 |
|         7733 |    85308 |               5 |
|         7733 |    85226 |               6 |
|         7733 |    11021 |               3 |
|         7733 |    35243 |               5 |
|         7733 |     7764 |               3 |
|         7733 |    26505 |               1 |
|        26505 |    85226 |               6 |
|        26505 |    55401 |               4 |
|        26505 |    92821 |               5 |
|        26505 |    45277 |               1 |
|        26505 |    26505 |               6 |
|        26505 |    94568 |               4 |
|        26505 |    85254 |               6 |
...

我正在尝试获取列出的 COUNTS 的最小值。所以我在一个选择中做了一个选择,我最终得到:

+-------------+---------+-----------+
| supplierzip | shopzip | MIN(type) |
+-------------+---------+-----------+
|        7733 |   55401 |         1 |
|       26505 |   85308 |         1 |
|       33603 |   94568 |         3 |
|       45277 |   33603 |         1 |
|       55401 |   55401 |         1 |
|       60601 |   85254 |         3 |
|       68154 |   94568 |         2 |
|       85226 |   85226 |         6 |
|       92821 |   85226 |         5 |
|       94568 |   45277 |         2 |
+-------------+---------+-----------+

使用查询:

select supplierzip, shopzip, MIN(type) 
from (
select su.supplier_zip as supplierzip, sp.shop_zip as shopzip, COUNT(p.ptypes) as type 
from supplier su 
inner join parts p on su.sid=p.sid 
inner join sales s on p.parts_pid=s.pid 
inner join shop sp on s.shop_id=sp.shop_id 
group by sp.shop_zip, su.supplier_zip 
order by su.supplier_zip)a 
group by supplierzip;

结果不对。因为当您查看供应商zip-7733 时,shopzip 应该是 26505,MIN(num) 为 1。但这不是我得到的答案。

【问题讨论】:

  • 您的查询应该会引发错误。 shopzip 不在组中
  • 当你将 shopzip 添加到组中时,它会列出所有不同的类型,但我只想要 min
  • 是的,但如果你这样做,你就不会得到你所说的结果。你是怎么得到这个结果的?
  • 难道没有办法做到这一点,当你得到每个供应商zip的最小值时,你就会得到相应的shopzip?
  • 肯定有。我想知道,您是如何达到当前结果的,以便我们继续努力

标签: sql count mariadb min groupwise-maximum


【解决方案1】:

改为使用窗口最小值:

SELECT
    supplierzip
  , shopzip
  , MIN( type ) over(partition by supplierzip)
FROM (
    SELECT
        su.supplier_zip   AS supplierzip
      , sp.shop_zip       AS shopzip
      , COUNT( p.ptypes ) AS type
    FROM supplier su
    INNER JOIN parts p ON su.sid = p.sid
    INNER JOIN sales s ON p.parts_pid = s.pid
    INNER JOIN shop sp ON s.shop_id = sp.shop_id
    GROUP BY
        su.supplier_zip 
      , sp.shop_zip
    ) a
ORDER BY
    supplierzip
  , shopzip

请注意,没有理由在子查询中使用 order by。

请注意,ONLY_FULL_GROUP_BY 现在是 MariaDB 和 MySQL 的默认行为,坦率地说,应该一直是(在我看来)。见GROUP BY

以你在问题中显示的结果为例:

+-------------+---------+-----------+
| supplierzip | shopzip | MIN(type) |
+-------------+---------+-----------+
|        7733 |   55401 |         1 |

来源于:

| supplier_zip | shop_zip | COUNT(p.ptypes) |
+--------------+----------+-----------------+
|         7733 |    85254 |               6 |
|         7733 |    33603 |               2 |
|         7733 |    92821 |               7 |
|         7733 |    95070 |               2 |
|         7733 |    94010 |               5 |
|         7733 |    68154 |               6 |
|         7733 |    45277 |               4 |
|         7733 |    94568 |               3 |
|         7733 |    55401 |               3 |  <<== why is 55401 chosen???
|         7733 |    85308 |               5 |
|         7733 |    85226 |               6 |
|         7733 |    11021 |               3 |
|         7733 |    35243 |               5 |
|         7733 |     7764 |               3 |
|         7733 |    26505 |               1 |

但是对于 shopzip 55401 的选择没有明显的逻辑。这(看起来)是在 ONLY_FULL_GROUP_BY 未启用时使用的“近似值”。

【讨论】:

    猜你喜欢
    • 2017-09-04
    • 2012-05-06
    • 2013-02-17
    • 2017-10-09
    • 2017-08-03
    • 2014-05-02
    • 2011-09-11
    • 2016-02-11
    • 1970-01-01
    相关资源
    最近更新 更多