Postgresql 动态统计某一列的某一值出现的次数实例
实例解析:
selectto_char(log.date,'yyyy-MM-ddHH24')ashour, log.exten,sum(caselog.gradewhen'1'then1else0end)as"1", sum(caselog.gradewhen'2'then1else0end)as"2", sum(caselog.gradewhen'3'then1else0end)as"3", sum(caselog.gradewhen'4'then1else0end)as"4", sum(caselog.gradewhen'5'then1else0end)as"5", log.directionfromiface_satisfaction_investigationaslog wherelog.date>='2017-08-0300:00:00'andlog.date<'2017-08-0400:00:00' groupbyhour,log.exten,log.directionorderbyhour,log.exten,log.directionasc
to_char:用于查询时间格式化,to_char(log.date,'yyyy-MM-ddHH24'),大致的结果是:2017-08-0313
sum():毫无疑问是用来计算总和的。
sum(caselog.gradewhen'1'then1else0end)是计算什么呢?
他的意思就是:
计算grade这个列的值为1的时候有多少行,后面的sum(……)就类推了。
其他的也没有什么好讲的了
补充:PostgreSQL常用的统计信息
我就废话不多说了,大家还是直接看代码吧~
/*计算表的空间大小*/ selectoid,table_schemaas"模式", table_nameas"表名", row_estimate::bigintas"表中的行数(估计值)", pg_size_pretty(total_bytes)as"总大小", pg_size_pretty(table_bytes)as"表大小", pg_size_pretty(index_bytes)as"索引大小", pg_size_pretty(toast_bytes)as"toast表总大小" from( select*,total_bytes-index_bytes-coalesce(toast_bytes,0)astable_bytes from( select c.oid, nspnameastable_schema, relnameastable_name, c.reltuplesasrow_estimate, pg_total_relation_size(c.oid)astotal_bytes, pg_indexes_size(c.oid)asindex_bytes, pg_total_relation_size(reltoastrelid)astoast_bytes frompg_classc leftjoinpg_namespacenonn.oid=c.relnamespace whererelkind='r' )t1 )t2orderby2,3; /*统计用户表信息*/ select schemanameas"模式", relnameas"表名", seq_scanas"顺序扫描的次数", seq_tup_readas"顺序扫描获取活动行的数量", idx_scanas"索引扫描次数", idx_tup_fetchas"索引扫描获取活动行的数量", n_tup_insas"累计插入的行数", n_tup_updas"累计更新的行数(包含HOT更新的行)", n_tup_delas"累计删除的行数", n_live_tupas"当前活动行估计数量", n_dead_tupas"当前死亡行的估计数量", n_mod_since_analyzeas"最后一次分析后被修改的行估计数量", last_vacuumas"上次被手动清理的时间(不统计VACUUMFULL)", last_autovacuumas"上次自动清理的时间", last_analyzeas"上次手动分析的时间", last_autoanalyzeas"上次自动清理分析的时间", vacuum_countas"手动清理的次数", autovacuum_countas"自动清理的次数", analyze_countas"手动分析的次数", autoanalyze_countas"自动分析的次数", pg_size_pretty(pg_table_size(relid))as"表大小(不包含索引)" frompg_stat_user_tables orderby1; /*统计用户表IO信息*/ select schemanameas"模式", relnameas"表名", heap_blks_readas"读取的磁盘块数量", heap_blks_hitas"缓冲区命中数量", idx_blks_readas"表上所有索引读取的磁盘块数", idx_blks_hitas"表上的所有索引缓冲区命中数量", toast_blks_readas"TOAST表(如果有)读取的磁盘块数", toast_blks_hitas"TOAST表(如果有)缓冲区命中数量", tidx_blks_readas"TOAST表索引(如果有)读取的磁盘块数", tidx_blks_hitas"TOAST表索引(如果有)缓冲区命中数量" frompg_statio_user_tables orderby1; /*统计用户索引信息*/ select indexrelid, schemanameas"模式", relnameas"索引所在的表名称", indexrelnameas"索引名称", idx_scanas"索引扫描次数", idx_tup_readas"索引扫描返回的索引项数量", idx_tup_fetchas"简单索引扫描获取的活动行数量", pg_size_pretty(pg_relation_size(indexrelid))as"索引大小" frompg_stat_user_indexes orderby1,2; /*追踪函数,需要打开track_functions参数(默认关闭)*/ select*frompg_stat_user_functions;
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。