博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
postgresql 窗口函数
阅读量:2435 次
发布时间:2019-05-10

本文共 1991 字,大约阅读时间需要 6 分钟。

窗口函数类似与汇聚函数,不同的是汇聚函数会将 记录集数据 汇聚 成一条记录,而窗口函数则不会,窗口函数也是作用在记录集上,但返回结果不会减少记录行数。

下面给出具体例子:

我们创建产品和产品组两张表:

CREATE
TABLE
product_groups
(
group_id
serial
PRIMARY
KEY,
group_name
VARCHAR
(255)
NOT NULL
);
 
CREATE
TABLE
products
(
product_id
serial
PRIMARY
KEY,
product_name
VARCHAR
(255)
NOT NULL,
price
DECIMAL
(11,
2),
group_id
INT
NOT NULL,
FOREIGN
KEY
(group_id)
REFERENCES
product_groups
(group_id)
);
 
INSERT
INTO
product_groups
(group_name)
VALUES
(
'Smartphone'),
(
'Laptop'),
(
'Tablet');
 
INSERT
INTO
products
(product_name,
group_id,price)
VALUES
(
'Microsoft Lumia',
1,
200),
(
'HTC One',
1,
400),
(
'Nexus',
1,
500),
(
'iPhone',
1,
900),
(
'HP Elite',
2,
1200),
(
'Lenovo Thinkpad',
2,
700),
(
'Sony VAIO',
2,
700),
(
'Dell Vostro',
2,
800),
(
'iPad',
3,
700),
(
'Kindle Fire',
3,
150),
(
'Samsung Galaxy Tab',
3,
200);
汇聚函数avg计算每个产品组的平均价为例:
sql语句:
SELECT
group_name,
AVG
(price)
FROM
products
INNER JOIN
product_groups
USING
(group_id)
GROUP BY
group_name;
结果:
group_name
|
        
avg
------------+----------------------
Tablet
     |
600
Smartphone
|
500
Laptop
     |
800
(3
rows)
窗口功能:
SQL
SELECT
product_name,
price,
group_name,
AVG
(price)
OVER
(
PARTITION
BY
group_name)
FROM
products
INNER JOIN
product_groups
USING
(group_id);
结果:
 product_name
    |
  price
  |
group_name
|
        
avg
--------------------+---------+------------+----------------------
HP
Elite
           |
  900.00
|
Laptop
     |
800
Lenovo
Thinkpad
    |
1100.00
|
Laptop
     |
800
Sony
VAIO
          |
  600.00
|
Laptop
     |
800
Dell
Vostro
        |
  600.00
|
Laptop
     |
800
Microsoft
Lumia
    |
  300.00
|
Smartphone
|
500
HTC
One
            |
  400.00
|
Smartphone
|
500
Nexus
              |
  500.00
|
Smartphone
|
500
iPhone
             |
  800.00
|
Smartphone
|
500
iPad
               |
  700.00
|
Tablet
     |
600
Kindle
Fire
        |
  300.00
|
Tablet
     |
600
Samsung
Galaxy
Tab
|
  800.00
|
Tablet
     |
600
(11
rows)
窗口函数语法:
window_function(arg1, arg2,..) OVER (PARTITION BY expression ORDER BY expression)
一个窗口函数执行在 JOIN, WHERE, GROUP BY 和HAVING子句之后,ORDER BY 子句之前。
内嵌窗口函数:
row_number(),
rank(),
dense_rank()
first_value(), last_value(), nth_value()
LAG(), LEAD() 等

转载地址:http://ojlmb.baihongyu.com/

你可能感兴趣的文章
Python numpy小练习
查看>>
Linux命令英文解释(按英文字母顺序)
查看>>
秋招面试准备-数据库知识
查看>>
数据分析岗-机器学习相关知识
查看>>
分类模型的效果评估
查看>>
深入理解什么是Java双亲委派模型
查看>>
MySQL优化Limit查询语句
查看>>
轻松入门MySQL主从复制原理
查看>>
SpringCloud全家桶---Zuul网关
查看>>
基于zuul和ribbon的灰度发布方案
查看>>
JVM常用垃圾收集器参数说明
查看>>
MySQL索引基础知识梳理
查看>>
MySQL事务ACID底层实现原理
查看>>
关于MySQL wait_timeout问题记录
查看>>
基础算法面试题---如何用栈实现队列
查看>>
基础算法面试题---如何用队列实现栈(1)
查看>>
基础算法面试题---如何用队列实现栈(2)
查看>>
基础算法面试题---如何数组实现栈和队列
查看>>
API接口安全性设计以及各参数的作用
查看>>
《Netty权威指南 第2版》学习笔记(1)---服务端与客户端开发入门
查看>>