SELECT id, name, age
FROM (
SELECT id, name, age
, count(distinct accesstype) over (partition by id) as cnt
FROM T
WHERE accesstype IN ('view','edit','share')
) AS U
WHERE cnt = 3
假设 id,accesstype 是唯一的,您可以将其更改为:
SELECT id, name, age
FROM (
SELECT distinct id, name, age
, count(accesstype) over (partition by id) as cnt
FROM T
WHERE accesstype IN ('view','edit','share')
) AS U
WHERE cnt = 3
要获取恰好具有这三种访问类型的行,可以将它们聚合到一个数组中:
请注意,
array[...]
表达式中元素的顺序对=
使用的运算符很重要,因为array['a', 'b']
不等于array['b', 'a']
。或者,您可以使用
bool_and()
就像是:
假设 id,accesstype 是唯一的,您可以将其更改为:
未经测试,因为您没有提供Fiddle或类似的。对于以后的帖子,请包含一些可以轻松重现您的场景的内容。
您还可以考虑将表规范化为访问类型的单独关系。此外,年龄是您应该从例如出生日期得出的信息。截至目前,您必须定期更新此属性(不清楚您如何知道 raj 何时变为 17 岁)