Дополнительные ограничения на столбцы, не появившиеся в GROUP BY без JOIN - PullRequest
0 голосов
/ 17 июня 2019

Рассмотрим следующую таблицу:

Company     BuildYear   ProductName   Cost
------    -----------   -----------   ----
  Foo         1900          A_1        50
  Foo         2000          B_1        50
  Foo         2000          B_2        50

  Bar         1900          A_1        50
  Bar         1900          A_2        100
  Bar         2000          B_1        50

Запрос № 1 (просто):

Мы ищем компаний, которые произвели только один вид продукции в 1900 ,В приведенном выше примере это будет только компания Foo с продуктом A_1 (компания Bar произвела два продукта различного типа, а именно A_1 и A_2)

. Для этого запрос будет:

SELECT *
FROM Table
WHERE BuildYear=1900
GROUP BY ProductName
HAVING COUNT(*) = 1

Запрос № 2 (моя проблема):

Сейчас мы ищем компаний, которые произвели только один вид продукции в 1900 году, и этот продукт стоит менее 75 .Для приведенной выше таблицы ответов ответом будет снова только компания Foo.

Нет необходимости говорить, что простое добавление AND cost<75 к вышеуказанному запросу возвращает неправильный ответ (как Foo, так и Bar).Кроме того, добавление его к предложению HAVING приводит к появлению сообщения об ошибке ниже:

Столбец «Стоимость» должен появляться в предложении GROUP BY или использоваться в статистической функции

С другой стороны, я бы предпочел не объединять результат вышеупомянутого запроса с исходной таблицей (если это возможно), поскольку таблица в действительности огромна.

Любая обратная связь будет принята с благодарностью.

ОБНОВЛЕНИЕ: столбцы, показанные выше, предназначены только для демонстрации, а в реальных таблицах они все TEXT (поэтому MIN / MAXтрюк не применяется)

Обновление: почему не работает добавление предложения AND cost<75 к WHERE?Поскольку этот пункт отключает продукт Bar::A_2, а после оценки HAVING он рассматривает Bar как компанию с одним продуктом.

1 Ответ

1 голос
/ 17 июня 2019

Если есть только один продукт, вы можете использовать MIN() или MAX() - они имеют одинаковое значение, если в группе только одна строка:

SELECT *
FROM Table
WHERE BuildYear = 1900
GROUP BY ProductName
HAVING COUNT(*) = 1 AND MIN(COST) < 75;

Если высохраняя числа в виде текста, вы должны исправить свои данные.

За исключением этого, просто конвертируйте его:

HAVING COUNT(*) = 1 AND MIN(COST::NUMERIC) < 75;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...