Где PostgresSQL 'ГДЕ' должен идти в агрегации? - PullRequest
0 голосов
/ 02 ноября 2018

Работает следующий запрос postgres:

dvdrental=# SELECT title, COUNT(title) AS c FROM film          
JOIN inventory
ON film.film_id = inventory.film_id GROUP BY film.title LIMIT 5;

      title       | c 
------------------+---
 Academy Dinosaur | 8
 Ace Goldfinger   | 3
 Adaptation Holes | 4
 Affair Prejudice | 7
 African Egg      | 3
(5 rows)

Time: 1.671 ms

Тогда, если я хочу ограничить, скажем, чтобы фильмы с определенным количеством копий в инвентаре, или посчитать, сколько фильмов имеет определенное количество в инвентаре, отправной точкой будет:

dvdrental=# SELECT title, COUNT(title) AS c FROM film
JOIN inventory
ON film.film_id = inventory.film_id GROUP BY film.title WHERE c = 4;
ERROR:  syntax error at or near "WHERE"
LINE 3: ...m.film_id = inventory.film_id GROUP BY film.title WHERE c = ...
                                                             ^
Time: 0.337 ms

.. но это не работает.

Я перепробовал каждую возможную позицию для WHERE c = 4 здесь, и она не будет работать. Есть ощущение, что это работало бы, если бы это был MySQL, а не PostgresSQL.

Кто-нибудь знает, как это исправить?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Если вы хотите использовать столбец C в предложении where, то можете также использовать запрос ниже.

WITH title_query 
  AS
  (
        SELECT title, COUNT(title) AS c FROM film
        JOIN inventory
        ON film.film_id = inventory.film_id     
        GROUP BY film.title
  ) 
  SELECT * FROM title_query WHERE C= 4
0 голосов
/ 02 ноября 2018

это будет having вместо where

    SELECT title, COUNT(title) AS c FROM film
    JOIN inventory
    ON film.film_id = inventory.film_id     
    GROUP BY film.title 
    having COUNT(title)=4

Предложение HAVING, используемое для агрегатной функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...