postgresql-窗口函数使用
背景
PostgreSQL作为世界上功能最强大的开源数据库,窗口函数作为业务过程中进行数据统计必不可少的功能,对PG自然是不在话下,PG内置了大量的窗口函数。
本文就是和大家一起在实际业务场景下如何使用窗口函数进行一探究竟。。。
一、os环境及postgresql版本
os环境
os:centos 6.4 [postgres@ test ~]$ uname -a Linux db 2.6.32-358.el6.x86_64[postgres@ test ~]$ gcc -vgcc 版本 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
测试数据
create table bills (id serial not null,goodsdesc text not null,beginunit text not null,begincity text not null,pubtime timestamp not null,amount float8 not null default 0,primary key (id) );COMMENT ON TABLE bills is '运单记录'; COMMENT ON COLUMN bills.id IS 'id号'; COMMENT ON COLUMN bills.goodsdesc IS '货物名称'; COMMENT ON COLUMN bills.beginunit IS '启运省份'; COMMENT ON COLUMN bills.begincity IS '启运城市'; COMMENT ON COLUMN bills.pubtime IS '发布时间'; COMMENT ON COLUMN bills.amount IS '运费';INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) VALUES(default,'衣服','海南省','三亚市','2015-10-05 09:32:01',ROUND((random()*10000)::NUMERIC,2));INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) VALUES(default,'建筑设备','福建省','三明市','2015-10-05 07:21:22',ROUND((random()*10000)::NUMERIC,2)); INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) VALUES(default,'设备','福建省','三明市','2015-10-05 11:21:54',ROUND((random()*10000)::NUMERIC,2));INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) VALUES(default,'普货','福建省','三明市','2015-10-05 15:19:17',ROUND((random()*10000)::NUMERIC,2));INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) VALUES(default,'5 0铲车,后八轮翻斗车','河南省','三门峡市','2015-10-05 07:53:13',ROUND((random()*10000)::NUMERIC,2));INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) VALUES(default,'鲜香菇2000斤','河南省','三门峡市','2015-10-05 10:38:29',ROUND((random()*10000)::NUMERIC,2));INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) VALUES(default,'旋挖附件38吨','河南省','三门峡市','2015-10-05 10:48:38',ROUND((random()*10000)::NUMERIC,2));INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) VALUES(default,'旋挖附件35吨','河南省','三门峡市','2015-10-05 10:48:38',ROUND((random()*10000)::NUMERIC,2));INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) VALUES(default,'旋挖附件39吨','河南省','三门峡市','2015-10-05 11:38:38',ROUND((random()*10000)::NUMERIC,2));INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) VALUES(default,'设备','上海市','上海市','2015-10-05 07:59:35',ROUND((random()*10000)::NUMERIC,2));INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) VALUES(default,'普货40吨需13米半挂一辆','上海市','上海市','2015-10-05 08:13:59',ROUND((random()*10000)::NUMERIC,2));
二、操作实践
row_number() --返回行号,对比值重复时行号不重复不间断,即返回1,2,3,4,5....,不返回1,2,2,4...
test=# select row_number() over(),* from bills limit 2; row_number | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+-----------+-----------+-----------+---------------------+---------1 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.62 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.12 (2 rows)test=# select row_number() over(),* from bills limit 2 offset 2; row_number | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+-----------+-----------+-----------+---------------------+---------3 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.334 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.16 (2 rows)
--接amount排序
test=# select row_number() over(partition by tableoid order by amount),* from bills; row_number | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+------------------------+-----------+-----------+---------------------+---------1 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5492 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.163 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.64 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.685 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.256 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.767 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.088 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.029 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.3310 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.5311 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.12 (11 rows)test=#
--按begincity分组,pubtime排序,注意红色记录行号不间断
test=# select row_number() over(partition by begincity order by pubtime),* from bills; row_number | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+------------------------+-----------+-----------+---------------------+---------1 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.61 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.122 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.333 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.161 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.682 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5493 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.254 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.765 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.531 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.082 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=#
rank()--返回行号,对比值重复时行号重复并间断,即返回1,2,2,4...
test=# select rank() over(partition by begincity order by pubtime),* from bills; rank | id | goodsdesc | beginunit | begincity | pubtime | amount ------+----+------------------------+-----------+-----------+---------------------+---------1 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.61 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.122 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.333 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.161 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.682 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5493 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.253 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.765 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.531 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.082 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=#
dance_rank()--返回行号,对比值重复时行号重复但不间断,即返回1,2,2,3...
test=# select dense_rank() over(partition by begincity order by pubtime),* from bills; dense_rank | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+------------------------+-----------+-----------+---------------------+---------1 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.61 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.122 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.333 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.161 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.682 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5493 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.253 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.764 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.531 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.082 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=#
percent_rank()从当前开始,计算在分组中的比例 (行号-1)*(1/(总记录数-1))
test=# select percent_rank() over(partition by begincity order by id),* from bills; percent_rank | id | goodsdesc | beginunit | begincity | pubtime | amount --------------+----+------------------------+-----------+-----------+---------------------+---------0 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.60 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.120.5 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.331 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.160 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.680.25 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5490.5 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.250.75 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.761 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.530 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.081 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=# select percent_rank() over(partition by begincity order by pubtime),* from bills; percent_rank | id | goodsdesc | beginunit | begincity | pubtime | amount --------------+----+------------------------+-----------+-----------+---------------------+---------0 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.60 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.120.5 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.331 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.160 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.680.25 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5490.5 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.250.5 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.761 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.530 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.081 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)
cume_dist() --返回行数除以记录数值
test=# select ROUND((cume_dist() over(partition by begincity order by id))::NUMERIC,2) AS cume_dist,* from bills;cume_dist | id | goodsdesc | beginunit | begincity | pubtime | amount -----------+----+------------------------+-----------+-----------+---------------------+---------1.00 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.60.33 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.120.67 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.331.00 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.160.20 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.680.40 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5490.60 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.250.80 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.761.00 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.530.50 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.081.00 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=#
ntile(分组数量)--让所有记录尽可以的均匀分布
test=# select ntile(3) over(partition by begincity order by id),* from bills; ntile | id | goodsdesc | beginunit | begincity | pubtime | amount -------+----+------------------------+-----------+-----------+---------------------+---------1 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.61 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.122 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.333 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.161 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.681 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5492 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.252 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.763 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.531 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.082 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=# select ntile(2) over(partition by begincity order by id),* from bills; ntile | id | goodsdesc | beginunit | begincity | pubtime | amount -------+----+------------------------+-----------+-----------+---------------------+---------1 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.61 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.121 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.332 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.161 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.681 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5491 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.252 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.762 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.531 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.082 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=#
lag(value any [, offset integer [, default any ]])
--返回偏移量值,offset integer是偏移值,正数时前值,负数时后值,没有取到值时用default代替
test=# select lag(amount,1,null) over(partition by begincity order by id),* from bills; lag | id | goodsdesc | beginunit | begincity | pubtime | amount ---------+----+------------------------+-----------+-----------+---------------------+---------| 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.6| 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.129370.12 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.336573.33 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.16| 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.682350.68 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 549549 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.254089.25 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.764766.76 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.53| 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.085094.08 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=# select lag(amount,1,0::float8) over(partition by begincity order by id),* from bills; lag | id | goodsdesc | beginunit | begincity | pubtime | amount ---------+----+------------------------+-----------+-----------+---------------------+---------0 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.60 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.129370.12 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.336573.33 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.160 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.682350.68 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 549549 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.254089.25 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.764766.76 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.530 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.085094.08 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=# select lag(amount,2,0::float8) over(partition by begincity order by id),* from bills; lag | id | goodsdesc | beginunit | begincity | pubtime | amount ---------+----+------------------------+-----------+-----------+---------------------+---------0 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.60 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.120 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.339370.12 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.160 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.680 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5492350.68 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.25549 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.764089.25 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.530 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.080 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=# select lag(amount,-2,0::float8) over(partition by begincity order by id),* from bills; lag | id | goodsdesc | beginunit | begincity | pubtime | amount ---------+----+------------------------+-----------+-----------+---------------------+---------0 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.61352.16 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.120 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.330 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.164089.25 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.684766.76 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5497614.53 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.250 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.760 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.530 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.080 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)
lead(value any [, offset integer [, default any ]])
--返回偏移量值,offset integer是偏移值,正数时取后值,负数时取前值,没有取到值时用default代替
test=# select lead(amount,2,null) over(partition by begincity order by id),* from bills;lead | id | goodsdesc | beginunit | begincity | pubtime | amount ---------+----+------------------------+-----------+-----------+---------------------+---------| 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.61352.16 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.12| 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.33| 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.164089.25 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.684766.76 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5497614.53 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.25| 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.76| 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.53| 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.08| 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=# select lead(amount,-2,null) over(partition by begincity order by id),* from bills;lead | id | goodsdesc | beginunit | begincity | pubtime | amount ---------+----+------------------------+-----------+-----------+---------------------+---------| 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.6| 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.12| 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.339370.12 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.16| 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.68| 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5492350.68 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.25549 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.764089.25 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.53| 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.08| 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)
first_value(value any)返回第一值
test=# select first_value(amount) over(partition by begincity order by id),* from bills;first_value | id | goodsdesc | beginunit | begincity | pubtime | amount -------------+----+------------------------+-----------+-----------+---------------------+---------1569.6 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.69370.12 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.129370.12 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.339370.12 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.162350.68 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.682350.68 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5492350.68 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.252350.68 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.762350.68 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.535094.08 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.085094.08 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=#
last_value(value any)返回最后值
test=# select last_value(amount) over(partition by begincity order by pubtime),* FROM bills; last_value | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+------------------------+-----------+-----------+---------------------+---------1569.6 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.69370.12 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.126573.33 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.331352.16 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.162350.68 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.68549 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5494766.76 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.254766.76 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.767614.53 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.535094.08 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.085333.02 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=#test=# select last_value(amount) over(partition by begincity),* FROM bills; last_value | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+------------------------+-----------+-----------+---------------------+---------1569.6 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.69370.12 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.339370.12 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.169370.12 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.124089.25 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.764089.25 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.534089.25 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.684089.25 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5494089.25 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.255094.08 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.025094.08 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.08 (11 rows)
注意不要加上order by id,默认情况下,带了order by 参数会从分组的起始值开始一直叠加,直到当前值(不是当前记录)不同为止,当忽略order by 参数则是整个分组。下面通过修改分组的统计范围就可以实现order by参数取最后值
test=# select last_value(amount) over(partition by begincity order by id range between unbounded preceding and unbounded following),* FROM bills;last_value | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+------------------------+-----------+-----------+---------------------+---------1569.6 | 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.61352.16 | 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.121352.16 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.331352.16 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.167614.53 | 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.687614.53 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 5497614.53 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.257614.53 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.767614.53 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.535333.02 | 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.085333.02 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=#
nth_value(value any, nth integer):返回窗口框架中的指定值
test=# select nth_value(amount,2) over(partition by begincity order by id),* from bills;nth_value | id | goodsdesc | beginunit | begincity | pubtime | amount -----------+----+------------------------+-----------+-----------+---------------------+---------| 1 | 衣服 | 海南省 | 三亚市 | 2015-10-05 09:32:01 | 1569.6| 2 | 建筑设备 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 9370.126573.33 | 3 | 设备 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6573.336573.33 | 4 | 普货 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 1352.16| 5 | 5 0铲车,后八轮翻斗车 | 河南省 | 三门峡市 | 2015-10-05 07:53:13 | 2350.68549 | 6 | 鲜香菇2000斤 | 河南省 | 三门峡市 | 2015-10-05 10:38:29 | 549549 | 7 | 旋挖附件38吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4089.25549 | 8 | 旋挖附件35吨 | 河南省 | 三门峡市 | 2015-10-05 10:48:38 | 4766.76549 | 11 | 旋挖附件39吨 | 河南省 | 三门峡市 | 2015-10-05 11:38:38 | 7614.53| 9 | 设备 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 5094.085333.02 | 10 | 普货40吨需13米半挂一辆 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 5333.02 (11 rows)test=#
统计各个城市的总运费及平均每单的运费
test=# select sum(amount) over(partition by begincity),avg(amount) over(partition by begincity),begincity,amount from bills;sum | avg | begincity | amount ----------+------------------+-----------+---------1569.6 | 1569.6 | 三亚市 | 1569.617295.61 | 5765.20333333333 | 三明市 | 6573.3317295.61 | 5765.20333333333 | 三明市 | 1352.1617295.61 | 5765.20333333333 | 三明市 | 9370.1219370.22 | 3874.044 | 三门峡市 | 4766.7619370.22 | 3874.044 | 三门峡市 | 7614.5319370.22 | 3874.044 | 三门峡市 | 2350.6819370.22 | 3874.044 | 三门峡市 | 54919370.22 | 3874.044 | 三门峡市 | 4089.2510427.1 | 5213.55 | 上海市 | 5333.0210427.1 | 5213.55 | 上海市 | 5094.08 (11 rows)test=#
窗口函数别名使用
test=# select sum(amount) over w,avg(amount) over w,begincity,amount from bills window w as (partition by begincity);sum | avg | begincity | amount ----------+------------------+-----------+---------1569.6 | 1569.6 | 三亚市 | 1569.617295.61 | 5765.20333333333 | 三明市 | 6573.3317295.61 | 5765.20333333333 | 三明市 | 1352.1617295.61 | 5765.20333333333 | 三明市 | 9370.1219370.22 | 3874.044 | 三门峡市 | 4766.7619370.22 | 3874.044 | 三门峡市 | 7614.5319370.22 | 3874.044 | 三门峡市 | 2350.6819370.22 | 3874.044 | 三门峡市 | 54919370.22 | 3874.044 | 三门峡市 | 4089.2510427.1 | 5213.55 | 上海市 | 5333.0210427.1 | 5213.55 | 上海市 | 5094.08 (11 rows)test=#
三、相关文档
- http://blog.163.com/digoal@126/blog/static/16387704020121024102312302/
- http://my.oschina.net/Kenyon/blog/79543
postgresql-窗口函数使用相关推荐
- PostgresQL窗口函数 last_value未返回预期结果原因排查
这是一篇个人学习笔记,仅供参考. 窗口函数(window function),或开窗函数,主要有以下几个: row_number():无重复排序 rank():并列跳排,数字不连续 desc_rank ...
- PostgreSQL 窗口函数复习笔记
在总结hive之前特地回去复习了一下,以前PostgreSQL的窗口函数(MySQL目前还没有支持),以下基于版本9.3实验. 我们都知道在sql中有一类函数叫做聚合函数,例如sum().avg(). ...
- PostgreSQL窗口函数
1. 需求背景 假设有如下简单的公司员工工资表(dep_salary) id employee_name department salary 1 张三 HR部 12000.00 2 李四 HR部 15 ...
- 《PostgreSQL开发指南》电子版PDF免费下载
为了方便大家阅读学习,制作了<PostgreSQL 开发指南>专栏的电子版PDF,免费开放下载:https://github.com/dongxuyang1985/postgresql_d ...
- 窗口函数rows between 、range between的使用
1 rows between rows between 控制窗口函数的范围 使用rows between可以根据自己的需求任意的控制窗口函数的范围 UNBOUNDED :不受控的,无限的: PRECE ...
- python函数知识点总结_函数总结_python函数总结_高中函数知识点总结 - 云+社区 - 腾讯云...
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! postgresql窗口函数总结postgresql窗口函数总结 1窗口函数说明 ...
- postgresql之窗口函数
postgresql之窗口函数 工作中可能会遇到按照部门业绩排名?找出前N的员工进行业绩奖励?两次消费时间隔了多久?等等这样的问题. 对于这样的问题,使用窗口函数能很好的简化sql. 窗口函数是sql ...
- postgresql 动态添加过滤条件_通过窗口函数进行过滤导致Postgresql
好的,最初这只是我们与我的一个朋友的笑话,但它变成了有趣的技术问题:) 我有以下的表格: CREATE TABLE stuff ( id serial PRIMARY KEY, volume inte ...
- 《PostgreSQL 开发指南》第 21 篇 窗口函数
<PostgreSQL 开发指南>专栏目录 第 01 篇 课程介绍 第 02 篇 PostgreSQL 简介 第 03 篇 PostgreSQL 安装 第 04 篇 角色与用户 第 05 ...
- postgresql 查询序列_时间序列数据库(TSDB)初识与选择
背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工智能.物联网.机器学习.商业智能.智能预警啊等等. 以前的系统,做数据可视化,信息管理,流程控制.现在业务已经不仅仅满足于这 ...
最新文章
- 如何更好的招聘软件测试人员?
- MYSQL水平拆分与垂直拆分
- c++中实现delphi的按类名生成类对象
- php为什么在变量前加,php中变量前加、@等符号是什么意思?
- 1063. 计算谱半径(20)
- JSONPath 解析 JSON 内容详解(翻译自 github)
- (32)VHDL实现同步复位D触发器
- 计算机应用技术专业标志,计算机应用技术论文
- 微服务升级_SpringCloud Alibaba工作笔记0011---Gateway常用的predicate
- python正则表达式练习题
- Visual studio2022 利用glfw+glad配置OpenGL环境
- 童年计算机课企鹅游戏,这些童年游戏,你一定玩过
- FDTD的PML设置
- debian安装离线源
- 基于大数据的优质服务 微车将构建汽车互联网新生态
- gr-osmosdr支持GNURadio的扩展
- Windows 更改终端服务(RDP 远程桌面) 默认远程端口的方法
- FileNotFoundException: /storage/emulated/0/Pictures/1582: open failed: EACCES (Permission denied)
- 关于求婚的那些浪漫故事
- 李迟2022年7月工作生活总结
热门文章
- linux xps 13 wifi,戴尔XPS 13无线网卡替换教程和教程 | MOS86
- Flutter之Widget构建过程详解
- Flink SQL 系列 | 5 个 TableEnvironment 我该用哪个?
- 5分钟学会 Vim 分屏操作方方面面
- vue点击按钮打开下拉菜单_vue 点击弹出下拉菜单 点击其他页面收回菜单
- android改变textview文字,如何在Android TextView中更改文本
- linux线程组和进程区别,Linux中进程和线程之间的区别
- 按键精灵 懒人插件连接mysql_按键精灵的办公插件大全下载-按键精灵懒人办公插件【新版】下载V15.0106.0.2官方免费版-西西软件下载...
- 介质簇结构不正确_电动蝶阀的结构特征以及优点,值得看完
- python中的math.floor可以用于整数吗_为什么Python的math.ceil()和math.floor()操作返回浮点数而不是整数?...