SQL Server-開窓関数

69633 ワード

 
   
--     :             (    )

SELECT * FROM dbo.Student

S#         Sname      Sage                    Ssex
---------- ---------- ----------------------- ----------
01                    1990-01-01 00:00:00.000  
02                    1990-12-21 00:00:00.000  
03                    1990-05-20 00:00:00.000  
04                    1990-08-06 00:00:00.000  
05                    1991-12-01 00:00:00.000  
06                    1992-03-01 00:00:00.000  
07                    1989-07-01 00:00:00.000  
08                    1990-01-20 00:00:00.000  

-- Over  ,            
SELECT *,MAX(DATEDIFF(yyyy,Sage,GETDATE()))OVER() MaxSage FROM dbo.Student

S#         Sname      Sage                    Ssex       MaxSage
---------- ---------- ----------------------- ---------- -----------
01                    1990-01-01 00:00:00.000            28
02                    1990-12-21 00:00:00.000            28
03                    1990-05-20 00:00:00.000            28
04                    1990-08-06 00:00:00.000            28
05                    1991-12-01 00:00:00.000            28
06                    1992-03-01 00:00:00.000            28
07                    1989-07-01 00:00:00.000            28
08                    1990-01-20 00:00:00.000            28
 
-- Over  ,           
SELECT *,COUNT(S#)OVER()     FROM dbo.Student

S#         Sname      Sage                    Ssex          
---------- ---------- ----------------------- ---------- -----------
01                    1990-01-01 00:00:00.000            8
02                    1990-12-21 00:00:00.000            8
03                    1990-05-20 00:00:00.000            8
04                    1990-08-06 00:00:00.000            8
05                    1991-12-01 00:00:00.000            8
06                    1992-03-01 00:00:00.000            8
07                    1989-07-01 00:00:00.000            8
08                    1990-01-20 00:00:00.000            8
 
-- Partition By       
--
SELECT *,COUNT(*) OVER(PARTITION BY Ssex)    FROM dbo.Student

S#         Sname      Sage                    Ssex         
---------- ---------- ----------------------- ---------- -----------
01                    1990-01-01 00:00:00.000            4
02                    1990-12-21 00:00:00.000            4
03                    1990-05-20 00:00:00.000            4
04                    1990-08-06 00:00:00.000            4
05                    1991-12-01 00:00:00.000            4
06                    1992-03-01 00:00:00.000            4
07                    1989-07-01 00:00:00.000            4
08                    1990-01-20 00:00:00.000            4
 
--        ,  、  
SELECT *,COUNT(*) OVER(PARTITION BY Ssex ORDER BY Sname)    FROM dbo.Student

S#         Sname      Sage                    Ssex         
---------- ---------- ----------------------- ---------- -----------
04                    1990-08-06 00:00:00.000            1
02                    1990-12-21 00:00:00.000            2
03                    1990-05-20 00:00:00.000            3
01                    1990-01-01 00:00:00.000            4
08                    1990-01-20 00:00:00.000            1
06                    1992-03-01 00:00:00.000            2
07                    1989-07-01 00:00:00.000            3
05                    1991-12-01 00:00:00.000            4
 
-- Over  ,            
SELECT *,AVG(DATEDIFF(yyyy,Sage,GETDATE()))OVER()      FROM dbo.Student

S#         Sname      Sage                    Ssex           
---------- ---------- ----------------------- ---------- -----------
01                    1990-01-01 00:00:00.000            26
02                    1990-12-21 00:00:00.000            26
03                    1990-05-20 00:00:00.000            26
04                    1990-08-06 00:00:00.000            26
05                    1991-12-01 00:00:00.000            26
06                    1992-03-01 00:00:00.000            26
07                    1989-07-01 00:00:00.000            26
08                    1990-01-20 00:00:00.000            26
 
--Row_Rumber()
SELECT *,ROW_NUMBER()OVER(ORDER BY S# DESC)    FROM dbo.Student

S#         Sname      Sage                    Ssex         
---------- ---------- ----------------------- ---------- --------------------
08                    1990-01-20 00:00:00.000            1
07                    1989-07-01 00:00:00.000            2
06                    1992-03-01 00:00:00.000            3
05                    1991-12-01 00:00:00.000            4
04                    1990-08-06 00:00:00.000            5
03                    1990-05-20 00:00:00.000            6
02                    1990-12-21 00:00:00.000            7
01                    1990-01-01 00:00:00.000            8
 
--Row_Rumber()       
WITH T AS ( 
    SELECT ROW_NUMBER() OVER ( ORDER BY S# DESC ) RowNumber ,*
    FROM dbo.Student
)
SELECT * FROM T WHERE T.RowNumber BETWEEN 1 AND 3

RowNumber            S#         Sname      Sage                    Ssex
-------------------- ---------- ---------- ----------------------- ----------
1                    08                    1990-01-20 00:00:00.000  
2                    07                    1989-07-01 00:00:00.000  
3                    06                    1992-03-01 00:00:00.000  
 
--Rank()     ,    ,  
SELECT *,RANK()OVER(ORDER BY Ssex)    FROM dbo.Student
S#         Sname      Sage                    Ssex         
---------- ---------- ----------------------- ---------- --------------------
01                    1990-01-01 00:00:00.000            1
02                    1990-12-21 00:00:00.000            1
03                    1990-05-20 00:00:00.000            1
04                    1990-08-06 00:00:00.000            1
05                    1991-12-01 00:00:00.000            5
06                    1992-03-01 00:00:00.000            5
07                    1989-07-01 00:00:00.000            5
08                    1990-01-20 00:00:00.000            5
 
--DENSE_Rank()     ,       
SELECT *,DENSE_RANK()OVER(ORDER BY Ssex)    FROM dbo.Student

S#         Sname      Sage                    Ssex         
---------- ---------- ----------------------- ---------- --------------------
01                    1990-01-01 00:00:00.000            1
02                    1990-12-21 00:00:00.000            1
03                    1990-05-20 00:00:00.000            1
04                    1990-08-06 00:00:00.000            1
05                    1991-12-01 00:00:00.000            2
06                    1992-03-01 00:00:00.000            2
07                    1989-07-01 00:00:00.000            2
08                    1990-01-20 00:00:00.000            2
 
-- NTILE()  ,  :    /     =       ,          (    )
SELECT *,NTILE(3)OVER(ORDER BY Ssex)    FROM dbo.Student

S#         Sname      Sage                    Ssex         
---------- ---------- ----------------------- ---------- --------------------
01                    1990-01-01 00:00:00.000            1
02                    1990-12-21 00:00:00.000            1
03                    1990-05-20 00:00:00.000            1
04                    1990-08-06 00:00:00.000            2
05                    1991-12-01 00:00:00.000            2
06                    1992-03-01 00:00:00.000            2
07                    1989-07-01 00:00:00.000            3
08                    1990-01-20 00:00:00.000            3

転載先:https://www.cnblogs.com/zhaoshujie/p/9594717.html