SQL MIN (COUNT) не работает должным образом? - PullRequest
0 голосов
/ 15 декабря 2018

Сначала я сгенерировал таблицу из следующего запроса:

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 |
...

, и я пытаюсь получить МИНУТ из СЧЕТОВ в списке.Таким образом, я сделал выбор в пределах выбора, и в итоге получаю:

+-------------+---------+-----------+
| 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;

Результаты не верны.потому что, когда вы смотрите на него для supplierzip-7733, значение shopzip должно быть 26505 с MIN (число), равным 1. Но это не тот ответ, который я получаю.

1 Ответ

0 голосов
/ 15 декабря 2018

Вместо этого используйте оконный минимум:

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 не включен.

...