SQL在联接表上计数唯一的真实值

伊万斯

我有users桌子

Table "public.users"
Column  |  Type   | Modifiers 
--------+---------+-----------
user_id | integer | 
style   | boolean | 
id      | integer | 

和一张access_rights桌子

Table "public.access_rights"
Column  |  Type   | Modifiers 
--------+---------+-----------
user_id | integer | 
id      | integer | 

我有一个查询,在访问权限上加入了用户,我想计算样式列中为true的值的数量。

从这个答案:postgresql-sql-`true`值的计数,我尝试做

SELECT COUNT( CASE WHEN style THEN 1 ELSE null END )
from users
join access_rights on access_rights.user_id = users.user_id
;

但是,当用户有多个access_rights行时,这将计算重复值。使用联接时,如何只计数一次值?

欧文·布兰德斯特

如果您对至少有1行带有的(style IS TRUE用户感兴趣access_rights,请access_rights在加入之前进行汇总

SELECT count(style OR NULL) AS style_ct
FROM   users
JOIN  (
   SELECT user_id, bool_or(style) AS style
   FROM   access_rights
   GROUP  BY 1
   ) u USING (user_id);

使用JOIN,因为没有任何输入的用户access_rights在这种情况下不算在内。
使用聚合函数bool_or()

或者更简单:

SELECT count(*) AS style_ct
FROM   (
   SELECT user_id
   FROM   access_rights
   GROUP  BY 1
   HAVING bool_or(style)
   );

这是假设外键加强了参照完整性,因此没有中access_rights.user_id没有相应的行users
同样假设NULLin中没有access_rights.user_id,这将使计数增加1-并可以通过使用count(user_id)代替来抵消count(*)

或者(如果该假设不成立)使用EXISTS半联接:

SELECT count( EXISTS (
              SELECT  1
              FROM    access_rights
              WHERE   user_id = u.user_id
              AND     style  -- boolean value evaluates on its own
              ) OR NULL
            )
FROM   users u;

我正在使用真实boolean的功能来简化计数和WHERE子句。详细信息:
在同一SELECT sql查询中从SUM()计算百分比

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用左联接进行一对多计数会在源表上计数错误

来自分类Dev

使用左联接进行一对多计数会在源表上计数错误

来自分类Dev

SQL计数和分组唯一值

来自分类Dev

SQL获取唯一值的计数

来自分类Dev

SQL计数总唯一值

来自分类Dev

仅在唯一列上计数记录

来自分类Dev

SQL计数表联接表

来自分类Dev

在联接表和联接表中均具有唯一值的Rails Habtm

来自分类Dev

如何获取列中唯一值的表计数

来自分类Dev

SQL将唯一值计数为单独的列

来自分类Dev

SQL唯一计数

来自分类Dev

使用内部联接在同一列上计数

来自分类Dev

联接表的唯一行的总和

来自分类Dev

如何使联接表条目唯一?

来自分类Dev

根据一列值联接SQL表中的多行

来自分类Dev

使用左外部联接的唯一值?

来自分类Dev

非唯一的SQL权限联接

来自分类Dev

MySQL 在多个表中计数唯一

来自分类Dev

如何创建执行左外部联接以及另一个表中的计数的SQL?

来自分类Dev

SQL:跨多个表联接对一个范围进行分组,返回包括0在内的计数

来自分类Dev

如何创建执行左外部联接并从另一个表进行计数的SQL?

来自分类Dev

SQL:跨多个表联接对一个范围进行分组,返回包括0在内的计数

来自分类Dev

Matlab中唯一值的累积计数

来自分类Dev

每组唯一值的累积计数

来自分类Dev

在熊猫中滚动唯一值计数

来自分类Dev

数组值的唯一计数

来自分类Dev

DataFrame,计数唯一值,Java

来自分类Dev

Mongodb获取唯一值的计数

来自分类Dev

在字符前查找唯一值的计数