我正在使用 Postgres,它强制执行 SELECT...GROUP BY 中的所有列必须出现在 GROUP BY 子句中或在聚合函数中使用的约束。
假设我正在为人们的汽车建模,我想算出一个人的姓名、牌照号码以及他们拥有的汽车数量。这是我作为SQL Fiddle 的示例。
我会有以下架构:
CREATE TABLE person(
id integer PRIMARY KEY,
name text
);
CREATE TABLE license(
person_id integer REFERENCES person(id),
expiry_date date
);
CREATE TABLE car(
owner_id integer REFERENCES person(id),
registration_number TEXT
);
Run Code Online (Sandbox Code Playgroud)
这是查询:
SELECT person.name, person.id, license.expiry_date, COUNT(car) FROM person
JOIN license ON license.person_id = person.id
JOIN car ON car.owner_id = person.id
WHERE person.name = 'Charles Bannerman'
GROUP BY person.id;
Run Code Online (Sandbox Code Playgroud)
我知道,因为我自己的业务逻辑,一个人只能有一个license,所以当我加入这个人的时候,即使是GROUP BY'd,我应该可以找到他们的license number。但是,因为它不是 GROUP …
我正在寻找正确的语法来过滤组(即已被“d”的行组GROUP BY
),其中至少一行符合特定条件。
例如,如果我想选择一个组,其中至少一行的 Fold_change 值大于 4,我希望这样可以工作:
HAVING ANY(rnaseq.fold_change) > 4
Run Code Online (Sandbox Code Playgroud)
但我得到了错误
错误:“ANY”处或附近的语法错误
我怀疑这是因为Postgres 要求常量值位于左侧,但如果我以相反的方式执行此操作,则会收到此错误
4 < ANY(rnaseq.fold_change)
Run Code Online (Sandbox Code Playgroud)
错误:op ANY/ALL(数组)需要右侧数组
我可以让它工作的唯一方法是使用 array_agg 像这样:
4 < ANY(array_agg(rnaseq.fold_change))
Run Code Online (Sandbox Code Playgroud)
但与第一个示例相比,该语法相当混乱,并且必须为每个组手动创建一个数组,听起来根本没有效率。
有没有正确的方法可以在 postgres 中进行 HAVING ANY 操作?