1. 程式人生 > >金典 SQL筆記(9)

金典 SQL筆記(9)

tom ng- 表示 方式 class lar 不同的 sdn win

技術分享

page301-354其它解決方式


---開窗函數
--測試數據及表
USE [NB]
GO
/****** 對象:  Table [dbo].[T_Person2]    腳本日期: 08/14/2015 11:24:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[T_Person3] (
      [FName] [varchar] (20) NULL,
      [FCity] [varchar] (20) NULL,
      [FAge] INT,
      FSalary INT
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('Tom' ,'BeiJing', 20,3000 )

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('Tim' ,'ChengDu', 21,4000 )

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('Jim' ,'BeiJing', 22,3500 )

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('Lily' ,'LonDon', 21,2000 )

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('John' ,'NewYork', 22,1000 )

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('YaoMing' ,'BeiJing', 20,3000 )

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('Swing' ,'LonDon', 22,2000 )

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('Guo' ,'NewYork', 20,2800 )

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('YuQian' ,'BeiJing', 24,8000 )

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('Ketty' ,'London', 25,8500 )

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('Merry' ,'BeiJing', 23,3500 )

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('Smith' ,'ChengDu', 30,3000 )

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('Bill' ,'BeiJing', 25,2000 )

INSERT INTO T_Person3(FName ,FCity, FAge,FSalary )
VALUES('Jerry' ,'NewYory', 24,3300 )

SELECT * FROM T_Person3
--與聚合函數一樣,開窗函數也是對行集組進行聚合計算
--可是它不像普通聚合函數那樣每組僅僅返回一個值 ,開窗函數能夠
--為每組返回多個值,由於開窗函數所運行聚合計算的行集組是窗
--口ISO SQL 規定了這種函數為開窗函數 ,在oracle 中則被稱為
--分析函數, 而在DB2中則被稱為 OLAP函數
SELECT COUNT (*) FROM T_Person3

--以下倆個表達是一個意思
SELECT FCity, FAge,COUNT (*) OVER () FROM T_Person3 

SELECT FCity, FAge,COUNT (*) FROM T_Person3
WHERE FSalary < 5000
GROUP BY FCity,FAge

--OVERkeyword表示把函數當成開窗函數而不是聚合函數
--SQL標準同意將全部聚合函數用做開窗函數 ,使用OVER keyword來
--區分這倆種使用方法
--上面中count(*)over() 對於查詢結果的每一行都返回全部符合
--條件的行的條數OVER()keyword後的括號裏還常常加入選項 ,用以
--改變進行聚合運算的窗體範圍假設 OVER()keyword後面的括號裏的
--選項為空, 則開窗函數會對結果集中的全部行進行聚合運算

--partition by 子句
--開窗函數over() keyword後的括號裏 ,能夠使用partition by 子句
--來定義行的區分,從而進行聚合計算與 group by子句不同,
--partition by子句創建的分區是獨立於結果集的 ,創建的分區僅僅是
--提供聚合計算的並且不同的開窗函數所創建的分區也互不影響
--範例以下SQL 用於顯示每個人員的信息及所屬城市的人員數
--同一個SQL 語句中能夠使用多個開窗函數 ,並且這些開窗函數並不會
--相互幹擾
--範例
SELECT FName, FCity, FAge , FSalary,
COUNT(*) OVER ( PARTITION BY FCity),
COUNT(*) OVER ( PARTITION BY FAge)  FROM t_Person3

--with子句與子查詢
--一次定義多次使用用於提取子查詢
WITH
SSSS AS
(
       SELECT FAge FROM T_person3 WHERE FAge <24
)

SELECT * FROM T_person3 AS t WHERE T.FAge IN ( SELECT * FROM SSSS )
--374


with
cr as
 (
     select FAge from T_person3
 )

 select * from T_person3 where FAge in ( select * from cr )


金典 SQL筆記(9)