窗口函數的使用
環境準備
drop table if exists bills ; 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) ) distribute by shard(id) to group default_group; 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()返回行號,不分組
teledb=# select row_number() over(),* from bills limit 2; row_number | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+-----------+-----------+-----------+---------------------+--------- 1 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 2 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 (2 rows) teledb=# select row_number() over(),* from bills limit 2 offset 3; row_number | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+-----------------------+-----------+-----------+---------------------+--------- 3 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 4 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 (2 rows)row_number()--返回行號,按amount排序
teledb=# select row_number() over(order by amount),* from bills; row_number | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+------------------------+-----------+-----------+---------------------+--------- 1 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 35.93 2 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1715.46 3 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 1926.81 4 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1988.18 5 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 2787.06 6 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 2807.08 7 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 3346.33 8 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 4714.07 9 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 5238.68 10 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 6888.82 11 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 8370.24 (11 rows)row_number()返回行號,按begincity分組,pubtime 排序
teledb=# select row_number() over(partition by begincity order by pubtime),* from bills; row_number | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+------------------------+-----------+-----------+---------------------+--------- 1 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 2 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 3 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 4 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 5 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 1 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 2 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 3 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 1 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 1 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 2 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)按begincity分組,按照pubtime進行排序,計算行號,每組的行號不中斷。
rank()返回行號,對比值重復時行號重復并間斷,即返回1,2,3,3,5...
teledb=# select rank() over(partition by begincity order by pubtime),* from bills; rank | id | goodsdesc | beginunit | begincity | pubtime | amount ------+----+------------------------+-----------+-----------+---------------------+--------- 1 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 2 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 3 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 3 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 5 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 1 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 2 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 3 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 1 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 1 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 2 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)使用rank(), order by比較的pubtime相同的情況下,行號重復并且間斷。
dense_rank()返回行號,對比值重復時行號重復但不間斷,即返回1,2,3,3,4...
teledb=# select dense_rank() over(partition by begincity order by pubtime),* from bills; dense_rank | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+------------------------+-----------+-----------+---------------------+--------- 1 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 2 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 3 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 3 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 4 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 1 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 2 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 3 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 1 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 1 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 2 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)使用dense_rank(),order by比較的pubtime相同的情況下,行號重復,但是下一個不中斷。
percent_rank()從當前開始,計算在分組中的比例(行號 - 1) * (1 / (總記錄數 - 1))
teledb=# select percent_rank() over(partition by begincity order by id),* from bills; percent_rank | id | goodsdesc | beginunit | begincity | pubtime | amount --------------+----+------------------------+-----------+-----------+---------------------+--------- 0 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 0.25 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 0.5 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 0.75 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 1 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 0 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 0.5 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 1 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 0 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 0 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 1 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)cume_dist()返回行數除以記錄數值
teledb=# 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 -----------+----+---------------+----------+-----------+------------+--------- 0.20 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 0.40 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 0.60 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 0.80 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 1.00 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 0.33 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 0.67 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 1.00 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 1.00 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 0.50 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 1.00 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)ntile(分組數量)讓所有記錄盡可以的均勻分布
teledb=# select ntile(2) over(partition by begincity order by id),* from bills; ntile | id | goodsdesc | beginunit | begincity | pubtime | amount -------+----+------------------------+-----------+-----------+---------------------+--------- 1 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 1 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 1 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 2 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 2 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 1 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 1 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 2 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 1 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 1 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 2 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows) teledb=# select ntile(3) over(partition by begincity order by id),* from bills; ntile | id | goodsdesc | beginunit | begincity | pubtime | amount -------+----+------------------------+-----------+-----------+---------------------+--------- 1 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 1 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 2 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 2 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 3 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 1 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 2 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 3 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 1 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 1 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 2 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)調用ntile(k),會將按照begincity分類后的記錄,每一個類別平均分成k組,盡可能平均。
lag(value any [, offset integer [, default any]] )返回偏移量值
offset integer是偏移值,正數時取前值,負數時取后值,沒有取到值時用default代替。
teledb=# select lag(amount,1,null) over(partition by begincity order by id),* from bills; lag | id | goodsdesc | beginunit | begincity | pubtime | amount ---------+----+------------------------+-----------+-----------+---------------------+--------- | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 6252.91 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 1828.83 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 9376.8 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 9885.95 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 8195.98 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 6351.44 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 1784.63 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)lag(amount, 1, null),1為正數,取前一條記錄的amount值。
teledb=# select lag(amount,-2,0::float8) over(partition by begincity order by id),* from bills; lag | id | goodsdesc | beginunit | begincity | pubtime | amount ---------+----+------------------------+-----------+-----------+---------------------+--------- 9376.8 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 9885.95 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 4971.79 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 0 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 0 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 7626.41 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 0 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 0 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 0 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 0 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 0 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)取后面第二條記錄amount的值。
lead(value any [,offset integer [, default any]] )返回偏移量值
與lag類似,offset integer是偏移值,但是正數時取后值,負數時取前值,沒有取到值時用default代替。
teledb=# select lead(amount,2,null) over(partition by begincity order by id),* from bills; lead | id | goodsdesc | beginunit | begincity | pubtime | amount ---------+----+------------------------+-----------+-----------+---------------------+--------- 9376.8 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 9885.95 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 4971.79 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 7626.41 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)first_value(value any) 返回第一值
teledb=# select first_value(amount) over(partition by begincity order by id),* from bills; first_value | id | goodsdesc | beginunit | begincity | pubtime | amount -------------+----+------------------------+-----------+-----------+---------------------+--------- 6252.91 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 6252.91 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 6252.91 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 6252.91 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 6252.91 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 8195.98 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 8195.98 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 8195.98 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 3714.15 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 1784.63 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 1784.63 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)返回每組的第一個值。
last_value(value any) 返回最后值
teledb=# select last_value(amount) over(partition by begincity order by pubtime),* from bills; last_value | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+----+-----------+-----------+---------------------+--------- 6252.91 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 1828.83 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 9376.8 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 9376.8 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 4971.79 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 8195.98 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 6351.44 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 7626.41 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 3714.15 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 1784.63 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 1425.64 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows) teledb=# select last_value(amount) over(partition by begincity),* FROM bills; last_value | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+------------------------+-----------+-----------+---------------------+--------- 9376.8 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 9376.8 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 9376.8 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 9376.8 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 9376.8 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 8195.98 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 8195.98 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 8195.98 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 3714.15 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 1425.64 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 1425.64 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows) teledb=# select last_value(amount) over(partition by begincity order by pubtime),* from bills; last_value | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+------------------------+-----------+-----------+---------------------+--------- 6252.91 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 1828.83 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 9376.8 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 9376.8 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 4971.79 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 8195.98 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 6351.44 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 7626.41 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 3714.15 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 1784.63 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 1425.64 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows) teledb=# select last_value(amount) over(partition by begincity),* FROM bills; last_value | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+------+-----------+-----------+--------------+--------- 9376.8 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 9376.8 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 9376.8 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 9376.8 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 9376.8 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 8195.98 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 8195.98 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 8195.98 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 3714.15 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 1425.64 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 1425.64 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)使用last_value時,注意不要加上order by,默認情況下,帶了order by參數會從分組的起始值開始一直疊加,直到當前值(不是當前記錄)不同為止,當忽略order by 參數則是整個分組。下面通過修改分組的統計范圍就可以實現order by參數取最后值。
teledb=# 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 ------------+----+------------------------+-----------+-----------+---------------------+--------- 4971.79 | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 4971.79 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 4971.79 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 4971.79 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 4971.79 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 7626.41 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 7626.41 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 7626.41 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 3714.15 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 1425.64 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 1425.64 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)nth_value(value any, nth integer):返回窗口框架中的指定值。
teledb=# select nth_value(amount,2) over(partition by begincity order by id),* from bills; nth_value | id | goodsdesc | beginunit | begincity | pubtime | amount -----------+----+------------------------+-----------+-----------+---------------------+--------- | 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 1828.83 | 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 1828.83 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 1828.83 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 1828.83 | 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 6351.44 | 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 6351.44 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 1425.64 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)返回每組的第2個amount值。
統計各個城市的總運費及平均每單的運費
teledb=# select sum(amount) over(partition by begincity),avg(amount) over(partition by begincity),begincity,amount from bills; sum | avg | begincity | amount ----------+------------------+-----------+--------- 32316.28 | 6463.256 | 三門峽市 | 6252.91 32316.28 | 6463.256 | 三門峽市 | 1828.83 32316.28 | 6463.256 | 三門峽市 | 9885.95 32316.28 | 6463.256 | 三門峽市 | 4971.79 32316.28 | 6463.256 | 三門峽市 | 9376.8 22173.83 | 7391.27666666667 | 三明市 | 6351.44 22173.83 | 7391.27666666667 | 三明市 | 7626.41 22173.83 | 7391.27666666667 | 三明市 | 8195.98 3714.15 | 3714.15 | 三亞市 | 3714.15 3210.27 | 1605.135 | 上海市 | 1784.63 3210.27 | 1605.135 | 上海市 | 1425.64 (11 rows)窗口函數別名使用
teledb=# select sum(amount) over w,avg(amount) over w,begincity,amount from bills window w as (partition by begincity); sum | avg | begincity | amount ----------+------------------+-----------+--------- 32316.28 | 6463.256 | 三門峽市 | 6252.91 32316.28 | 6463.256 | 三門峽市 | 1828.83 32316.28 | 6463.256 | 三門峽市 | 9885.95 32316.28 | 6463.256 | 三門峽市 | 4971.79 32316.28 | 6463.256 | 三門峽市 | 9376.8 22173.83 | 7391.27666666667 | 三明市 | 6351.44 22173.83 | 7391.27666666667 | 三明市 | 7626.41 22173.83 | 7391.27666666667 | 三明市 | 8195.98 3714.15 | 3714.15 | 三亞市 | 3714.15 3210.27 | 1605.135 | 上海市 | 1784.63 3210.27 | 1605.135 | 上海市 | 1425.64 (11 rows)獲取每個城市運費前兩名訂單
teledb=# select * from (select row_number() over(partition by begincity order by amount desc),* from bills) where row_number<3; row_number | id | goodsdesc | beginunit | begincity | pubtime | amount ------------+----+------------------------+-----------+-----------+---------------------+--------- 1 | 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 2 | 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 1 | 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 2 | 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 1 | 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 1 | 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 2 | 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (7 rows)