window function example 1

今天一位朋友问我一个平时可能用得比较少的需求:
有一个这样的表,记录如下:
id | company | product
----+---------+---------
  1 | c1      | p1
  1 | c1      | p2
  1 | b1      | p2
  1 | c2      | p2
  1 | c1      | p1
  2 | c3      | p3
需要找出某个产品,这个产品只有一个公司生产。
思路是这样的:
首先按产品把数据分成一个个的组,需要找出组内的公司值唯一记录。
用到窗口函数last_value和first_value
SQL如下:
test=> select id,company,product,first_value(company) over(partition by product) fv,last_value(company) over(partition by product) lv from tbl_test;
id | company | product | fv | lv
----+---------+---------+----+----
  1 | c1      | p1      | c1 | c1
  1 | c1      | p1      | c1 | c1
  1 | c1      | p2      | c1 | c2
  1 | b1      | p2      | c1 | c2
  1 | c2      | p2      | c1 | c2
  2 | c3      | p3      | c3 | c3
(6 rows)
封装一层后得到想要的结果:
test=> select id,company,product from (select id,company,product,first_value(company) over(partition by product) fv,last_value(company) over(partition by product) lv from tbl_test) t where fv=lv;
id | company | product
----+---------+---------
  1 | c1      | p1
  1 | c1      | p1
  2 | c3      | p3
(3 rows)

如果有空存在的话再另外处理一下.
思路就是这样

作者: digoal   发布时间: 2011-02-22

现在的DBMS提供的分析函数有很多了。

作者: renxiao2003   发布时间: 2011-02-28