INSERT INTO [employee] select 2 ,[emp_name] ,[gender] ,[department] ,[salary] from [employee] select * from ( select ROW_NUMBER() over(partition by emp_id order by emp_id) empid ,* from [employee]) as tb where tb.empid=1 delete tb from (select ROW_NUMBER() over(partition by emp_id order by emp_id) empid,*from employee) as tb where tb.empid>1 select * from employee
上面就是開窗函數例子,開窗函數是在 ISO 標准中定義的。SQL Server 提供排名開窗函數和聚合開窗函數。
在開窗函數出現之前存在着很多用 SQL 語句很難解決的問題,很多都要通過復雜的相關子查詢或者存儲過程來完成。SQL Server 2005 引入了開窗函數,使得這些經典的難題可以被輕松的解決。
窗口是用戶指定的一組行。開窗函數計算從窗口派生的結果集中各行的值。開窗函數分別應用於每個分區,並為每個分區重新啟動計算。
OVER 子句用於確定在應用關聯的開窗函數之前,行集的分區和排序。PARTITION BY 將結果集分為多個分區。