对列的额外约束未出现在没有 JOIN 的 GROUP BY 中



请考虑下表:

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年只生产一种产品的公司。在上面的例子中,只有公司FooA_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添加到上述查询中会返回错误的答案(FooBar)。此外,将其添加到HAVING子句中会引发以下错误消息:

列"成本"必须出现在 GROUP BY 子句中或在聚合函数中使用

另一方面,我宁愿不再次将上述查询的结果与原始表联接(如果可能的话),因为该表实际上很大。

任何反馈将不胜感激。

更新:上面显示的列仅用于演示,在实际表中它们都是TEXT的(因此 MIN/MAX 技巧不适用)

更新:为什么AND cost<75添加到WHERE子句不起作用?由于该条款切断了Bar::A_2产品,并且之后HAVING正在评估时,它将Bar视为拥有一种产品的公司。

如果只有一个产品,则可以使用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;

最新更新