Агрегатные функции

GROUP BY и WHERE

Важно понимать, в какой момент выполнения запроса вычисляются значения агрегатных функций. А вычисляются они по набору данных, полученному после выполнения соединений из FROM и применения ограничений из WHERE.

Проведем ряд экспериментов (мы любим проводить эксперименты, если сомневаешься в чем-то - поэкспериментируй). Получим информацию о заказах и товарах в них:

SELECT p.store_id,
       pi.product_id,
       pi.price
  FROM purchase p
  JOIN purchase_item pi
    ON pi.purchase_id = p.purchase_id
 ORDER BY p.store_id
store_idproduct_idprice
100326100.00
100326100.00
201421500.00
20112100000.00
30174900.00
302944500.00
302838300.00
302838300.00
.........

Теперь найдем минимальную стоимость товара в заказах в пределах магазина:

SELECT p.store_id,
       min(pi.price) as price_min
  FROM purchase p
  JOIN purchase_item pi
    ON pi.purchase_id = p.purchase_id
 GROUP BY p.store_id
 ORDER BY p.store_id
store_idprice_min
10026100.00
20121500.00
3014900.00
30238300.00
......

А теперь оставим только товары, проданные дороже 25000:

SELECT p.store_id,
       min(pi.price) as price_min
  FROM purchase p
  JOIN purchase_item pi
    ON pi.purchase_id = p.purchase_id
 WHERE pi.price > 25000
 GROUP BY p.store_id
 ORDER BY p.store_id
store_idprice_min
10026100.00
201100000.00
30238300.00

Для 201 магазина price_min сменилась с 21500.00 на 100000.00, а строка с 301-м магазином вообще пропала. Чтобы посмотреть, по какому набору данных вычислялась агрегатная функция min, достаточно в первый запрос добавить условие на стоимость:

SELECT p.store_id,
       pi.product_id,
       pi.price
  FROM purchase p
  JOIN purchase_item pi
    ON pi.purchase_id = p.purchase_id
 WHERE pi.price > 25000
 ORDER BY p.store_id
store_idproduct_idprice
100326100.00
100326100.00
20112100000.00
302838300.00
302838300.00
302944500.00
.........
    ПредыдущаяСледующая