按位聚合函数 - Amazon Redshift

按位聚合函数

按位聚合函数会进行位运算,以聚合整数列和可转换或舍入为整数值的列。

在按位聚合中使用 NULL

在将按位函数应用于可为 null 的列时,在计算函数结果之前将消除任何 NULL 值。如果没有行符合聚合资格,则按位函数将返回 NULL。相同的行为适用于常规的聚合函数。以下为示例。

select sum(venueseats), bit_and(venueseats) from venue where venueseats is null; sum | bit_and ------+--------- null | null (1 row)

按位聚合的 DISTINCT 支持

与其他聚合函数相同的是,按位函数也支持 DISTINCT 关键字。

但是,将 DISTINCT 用于这些函数不会影响结果。值的第一个实例足以满足按位 AND 或 OR 操作。如果重复值出现在正在计算的表达式中,不会造成任何差异。

由于 DISTINCT 处理可能会产生一些查询执行开销,我们建议不要将 DISTINCT 用于按位函数。

按位函数的概述示例

下面,您可以找到一些概述示例,说明如何使用按位函数。您还可以通过每个函数描述找到具体的代码示例。

按位函数的示例以 TICKIT 示例数据库为基础。TICKIT 示例数据库中的 USERS 表包含多个布尔列,该类列指示每个用户是否喜欢各种类型的活动,如运动、戏剧、歌剧等。下面是一个示例。

select userid, username, lastname, city, state, likesports, liketheatre from users limit 10; userid | username | lastname | city | state | likesports | liketheatre -------+----------+-----------+--------------+-------+------------+------------- 1 | JSG99FHE | Taylor | Kent | WA | t | t 9 | MSD36KVR | Watkins | Port Orford | MD | t | f

假定新版本的 USERS 表是以不同的方式构建的。在此新版本中,包含一个整数列,该列定义(以二进制格式)每个用户喜欢或不喜欢的 8 种类型的事件。在此设计中,每个位位置均代表一类活动。某个喜欢全部 8 种类型的用户已将全部 8 个位设置为 1(如下表的第一行中所示)。不喜欢任何这些活动的用户已将全部 8 个位设置为 0(请见第二行)。仅喜欢运动和爵士乐的用户显示在以下第三行中:

SPORTS THEATRE JAZZ OPERA ROCK VEGAS BROADWAY CLASSICAL
用户 1 1 1 1 1 1 1 1 1
用户 2 0 0 0 0 0 0 0 0
用户 3 1 0 1 0 0 0 0 0

在数据库表中,这些二进制值可作为整数存储在一个 LIKES 列中,如下所示。

User 二进制值 存储的值(整数)
用户 1 11111111 255
用户 2 00000000 0
用户 3 10100000 160