Sql Postgres组至少有一行状态=';已启动';
我需要执行分组,并且仅当至少一个观察值与约束匹配时才包括。就像我试图在下面描述的那样Sql Postgres组至少有一行状态=';已启动';,sql,postgresql,group-by,having-clause,Sql,Postgresql,Group By,Having Clause,我需要执行分组,并且仅当至少一个观察值与约束匹配时才包括。就像我试图在下面描述的那样 SELECT {some variables} FROM my_table GROUP BY A HAVING {at least 1 row with status='started'} 我最初猜测要替换的是“至少有一行的status='started'”是“bool_或(status='started')”。这不管用 你们有人有建议吗 编辑: 很好。它对我不起作用的原因是我使用了错误的引号。感谢您的帮助,
SELECT {some variables}
FROM my_table
GROUP BY A
HAVING {at least 1 row with status='started'}
我最初猜测要替换的是“至少有一行的status='started'”是“bool_或(status='started')”。这不管用
你们有人有建议吗
编辑:
很好。它对我不起作用的原因是我使用了错误的引号。感谢您的帮助,并对给您带来的不便表示歉意。在Postgres中使用bool_或(status='started'
)是一个不错的选择,可能是您最好的选择
它实际上相当于:
having max( (status = 'started')::int ) = 1
为了完整性:在标准SQL中,您可以使用大小写表达式来表达:
having max(case when status = 'started' then 1 end) = 1
或者在现代标准SQL中:具有count(*)filter(其中status='started')>0
@a_horse_,with_no_name:这是ANSI标准的一部分吗?我这样问是因为我知道Postgres是唯一支持这种语法的数据库。是的,它是在SQL中添加的:2006@a_horse_with_no_name:好的,谢谢你的信息。很遗憾,这样的文件不能免费获得。。。而且,数据库产品在实现如此有价值的部分时并没有付出真正的努力,这也是一个遗憾!
having max(case when status = 'started' then 1 end) = 1