没有JOIN的GROUP BY中不会出现对列的额外约束

时间:2019-06-17 20:22:22

标签: sql postgresql performance

请考虑下表:

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年仅生产一种产品的公司。在上面的示例中,只有拥有A_1产品的公司Foo(公司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视为拥有一个产品的公司。

1 个答案:

答案 0 :(得分:1)

如果只有一种产品,则可以使用@Injectable({ providedIn: 'root' }) MIN() -如果组中只有一行,则它们具有相同的值:

MAX()

如果您将数字存储为文本,则应该修正数据。

除此以外,只需将其转换即可:

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