深入理解bit_or和bit_and,bit_count
bit_or:二进制数按位或,bit_and:二进制数按位与,bit_count:统计二进制数1个个数
下面以一个例子来说明用法:
示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里。
1
2
3
4
5
6
7
-- 创建表
CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,
day INT(2) UNSIGNED ZEROFILL);
-- 插入测试数据
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
(2000,2,23),(2000,2,23);
测试数据截图如下:
mysql> select*from t1;
+------+-------+------+
| year | month | day |
+------+-------+------+
| 2000 | 01 | 01 |
| 2000 | 01 | 20 |
| 2000 | 01 | 30 |
| 2000 | 02 | 02 |
| 2000 | 02 | 23 |
| 2000 | 02 | 23 |
+------+-------+------+
6 rows in set (0.01 sec)
从上面的数据可以看出,1月份有3天有访问,2月份有2天访问。如果用group by来计算,需要使用两次,笔者自己写了个sql语句:
1
2
3
select year, month, count(0)
from (select year, month, day,count(0) from t1 group by year, month, day) as tmp
group by year, month;
就是先按照year,month,day分组计算一次,将结果当成临时表再按照year,month分组计算一次。
官方手册上使用的这样的语句:
1
2
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1
GROUP BY year,month;
bit_count函数的含义
用来计算二进制数中包含1的个数。
1
select BIT_COUNT(10);
因为10转成二进制是1010,所以该结果就是2。
bit_or函数的含义
就是对两个二进制数进行或运算。如:
1100
或 0101
--------------
1101
上面例子中当计算2月份的访问天数时,
(1<< 02) | (1 << 23) | (1<<23) = 100 | 1000...(23个0)| 1000...(23个0) = 1000...100
再用bit_count一算就是2了,非常巧妙。
此处针对1<<day进行解释:这里的计数采取的是位图法,每天有访问就用1表示,02天表示100,23表示1000..(23个0)。
最后经过bit_or按位或后变成10000..(20个0)100,然后用bit_count统计2进制1的个数为2,非常巧妙
结果:
mysql> select year,month,bit_count(bit_or(1<<day)) as days from t1 group by year,month;
+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
+------+-------+------+
2 rows in set (0.00 sec)
此外,还可以对day使用distinct来去重,得出每月有访问的天数:
mysql> select year,month,count(distinct day) from t1 group by year,month;
+------+-------+---------------------+
| year | month | count(distinct day) |
+------+-------+---------------------+
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
+------+-------+---------------------+
---------------------
作者:峰之流觞
来源:CSDN
原文:https://blog.csdn.net/koli6678/article/details/79841153
版权声明:本文为
bit_or:二进制数按位或,bit_and:二进制数按位与,bit_count:统计二进制数1个个数
下面以一个例子来说明用法:
示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里。
1
2
3
4
5
6
7
-- 创建表
CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,
day INT(2) UNSIGNED ZEROFILL);
-- 插入测试数据
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
(2000,2,23),(2000,2,23);
测试数据截图如下:
mysql> select*from t1;
+------+-------+------+
| year | month | day |
+------+-------+------+
| 2000 | 01 | 01 |
| 2000 | 01 | 20 |
| 2000 | 01 | 30 |
| 2000 | 02 | 02 |
| 2000 | 02 | 23 |
| 2000 | 02 | 23 |
+------+-------+------+
6 rows in set (0.01 sec)
从上面的数据可以看出,1月份有3天有访问,2月份有2天访问。如果用group by来计算,需要使用两次,笔者自己写了个sql语句:
1
2
3
select year, month, count(0)
from (select year, month, day,count(0) from t1 group by year, month, day) as tmp
group by year, month;
就是先按照year,month,day分组计算一次,将结果当成临时表再按照year,month分组计算一次。
官方手册上使用的这样的语句:
1
2
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1
GROUP BY year,month;
bit_count函数的含义
用来计算二进制数中包含1的个数。
1
select BIT_COUNT(10);
因为10转成二进制是1010,所以该结果就是2。
bit_or函数的含义
就是对两个二进制数进行或运算。如:
1100
或 0101
--------------
1101
上面例子中当计算2月份的访问天数时,
(1<< 02) | (1 << 23) | (1<<23) = 100 | 1000...(23个0)| 1000...(23个0) = 1000...100
再用bit_count一算就是2了,非常巧妙。
此处针对1<<day进行解释:这里的计数采取的是位图法,每天有访问就用1表示,02天表示100,23表示1000..(23个0)。
最后经过bit_or按位或后变成10000..(20个0)100,然后用bit_count统计2进制1的个数为2,非常巧妙
结果:
mysql> select year,month,bit_count(bit_or(1<<day)) as days from t1 group by year,month;
+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
+------+-------+------+
2 rows in set (0.00 sec)
此外,还可以对day使用distinct来去重,得出每月有访问的天数:
mysql> select year,month,count(distinct day) from t1 group by year,month;
+------+-------+---------------------+
| year | month | count(distinct day) |
+------+-------+---------------------+
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
+------+-------+---------------------+
---------------------
作者:峰之流觞
来源:CSDN
原文:https://blog.csdn.net/koli6678/article/details/79841153
转载于:https://www.cnblogs.com/localtion/p/10515118.html
深入理解bit_or和bit_and,bit_count相关推荐
- mysql兼容性高吗_MySQL与标准的兼容性
作者:创新互联 文章来源:虚拟主机 点击数: 更新时间:2013-04-21 MySQL包含了一些可能在其他SQL数据库找不到的扩充.要注意如果你使用他们,你的代码把不与其他SQL服务器兼容.在一些情 ...
- 【MySQL5.7指南】第一章——概述
1.1 关于本手册 1.2 MySQL数据库管理系统概述 1.3 MySQL 5.7 的新特性 1.4 在 MySQL 5.7 中添加.弃用或删除的服务器和状态变量和选项 1.5 MySQL信息来源 ...
- MySQL8的8大新SQL特性
目录 介绍 公用表表达式(CTE) 窗口函数 作为默认值的表达式 降序索引 函数索引关键部件 强制转换的其他目标类型 具有重复键更新的行和列别名 正则表达式支持 结论 介绍 尽管MySQL8已在近3年 ...
- Uedit32高亮文件(加强)
替换根目录下 wordfile.txt / /L1"C/C++" C_LANG Line Comment = // Block Comment On = /* Block Comm ...
- MySQL 8.0有什么新功能
https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/ 我们自豪地宣布MySQL 8.0的一般可用性. 现在下载 ...
- oracle raw性能,对Oracle Raw类型的详细解剖
SQL create table datatype_test_raw(paddr raw(8)); Table created SQL insert into datatype_test_raw(pa ...
- oracle中raw是什么格式,oracle中RAW数据类型
近日在研究v$latch视图时,发现一个从未见过的数据类型.v$latch 中ADDR属性的数据类型为RAW(4|8) 同时也发现v$process中的ADDR属性的数据类型也为RAW(4|8).于 ...
- [Lua工具类]Lua 中MD5的实现
lua的MD5实现方法: local md5 = {_VERSION = "md5.lua 1.1.0",_DESCRIPTION = "MD5 computation ...
- mybatis类型转换配置(springboot集成mybatis的配置)
使用mybatis将string转为blob存入数据库时出现ora-01465异常,无效的十六进制转换!求解,求解 oracle中用于保存位串的数据类型是RAW,LONGRAW(推荐使用BLOB). ...
最新文章
- 通过代码自定义cell(cell的高度不一致)
- 英语和数学不好可以学python-西安童程童美Python人工智能少儿编程课程好不好
- UML建模——用例图(Use Case Diagram)
- c++ createtoolhelp32snapshot取进程路径_Linux进程间通信(上)之管道、消息队列实践
- shell脚本中向hive动态分区插入数据
- 在linux中dns不安装coching,ubuntu 8.04下openldap的安装和使用
- java基本数据类型的标识符_java基础(一)-标识符、变量、基本数据类型及转换、运算符及表达式...
- python numpy数组切片_python中numpy数组切片实验解释
- 4站地铁50多分钟,百度地图怎么算的
- Atitit. Exception in thread main java.lang.Error: Unresolved compilation problem:
- CUDA优化之PReLU性能调优
- vega8显卡和mx250哪个好_哪种显卡等效于vega8 vs.mx150?什么显卡等效于MX110与mx110....
- SAP License:SAP五大主流ERP一览
- MySQL特异功能之:Impossible WHERE noticed after reading const tables
- 未检测到正确安装的网络适配器_网络适配器图标出现黄色感叹号的解决办法
- 分发自动化_使用bitrise自动化应用分发
- 笔记本外接显示器无声音
- 近岸蛋白递交注册:年营收3.4亿 朱化星控制71.24%表决权
- Ubuntu安装后,无启动项,解决办法
- 实验二、贪吃蛇的游戏开发
热门文章
- Microsoft Edge 开启 IE 模式
- 东北大学计算机a类吗,东北大学在985大学中水平怎么样?东北大学2020能回归双一流A类吗?...
- 什么是 FreeMarker?
- 英飞凌SP370方案胎压监测器-专业级视频课程-朱有鹏-专题视频课程
- Chap和pap认证
- 真相 | 投机者根本不是用户!区块链市场因他们起高楼,因他们崩到底!
- OnSysCommand( UINT nID, LPARAM lParam );分析
- 香港大学计算机授课型硕士(MSc)申请经验分享
- 产品开发阶段 EVT DVT PVT MP
- laravel-excel使用(老猫包子店的故事)