zoukankan      html  css  js  c++  java
  • SQL2012(聚合函数+排序函数)用法介绍

    /***************************************
    2012 - Aggregate with order
    ****************************************/
    ;with CTEOrders as
    	(select cast(1 as int) as OrderID, cast('3/1/2012' as date) as OrderDate, cast(10.00 as money) as OrderAmt, 'Joe' as CustomerName
    	union select 2, '3/1/2012', 11.00, 'Sam'
    	union select 3, '3/2/2012', 10.00, 'Beth'
    	union select 4, '3/2/2012', 15.00, 'Joe'
    	union select 5, '3/2/2012', 17.00, 'Sam'
    	union select 6, '3/3/2012', 12.00, 'Joe'
    	union select 7, '3/4/2012', 10.00, 'Beth'
    	union select 8, '3/4/2012', 18.00, 'Sam'
    	union select 9, '3/4/2012', 12.00, 'Joe'
    	union select 10, '3/4/2012', 11.00, 'Beth'
    	union select 11, '3/5/2012', 14.00, 'Sam'
    	union select 12, '3/6/2012', 17.00, 'Beth'
    	union select 13, '3/6/2012', 19.00, 'Joe'
    	union select 14, '3/7/2012', 13.00, 'Beth'
    	union select 15, '3/7/2012', 16.00, 'Sam'
    	)
    select OrderID
    	,OrderDate
    	,OrderAmt
    	,CustomerName 
    	,SUM(OrderAmt) OVER (PARTITION BY datepart(yyyy, OrderDate) ORDER BY OrderDate) as AnnualRunning -- accumulate by day within year
    	,SUM(OrderAmt) OVER (PARTITION BY CustomerName ORDER BY OrderDate, OrderID) as RunningByCustomer -- accumulate by date then orderID within customer
       from CTEOrders
       --ORDER BY CustomerName
       ORDER BY OrderDate
    ;
    /*
    OrderID	OrderDate	OrderAmt	CustomerName	AnnualRunning	RunningByCustomer
    1	2012-03-01	10.0000	Joe	21.0000	10.0000
    2	2012-03-01	11.0000	Sam	21.0000	11.0000
    5	2012-03-02	17.0000	Sam	63.0000	28.0000
    4	2012-03-02	15.0000	Joe	63.0000	25.0000
    3	2012-03-02	10.0000	Beth	63.0000	10.0000
    6	2012-03-03	12.0000	Joe	75.0000	37.0000
    9	2012-03-04	12.0000	Joe	126.0000	49.0000
    7	2012-03-04	10.0000	Beth	126.0000	20.0000
    10	2012-03-04	11.0000	Beth	126.0000	31.0000
    8	2012-03-04	18.0000	Sam	126.0000	46.0000
    11	2012-03-05	14.0000	Sam	140.0000	60.0000
    12	2012-03-06	17.0000	Beth	176.0000	48.0000
    13	2012-03-06	19.0000	Joe	176.0000	68.0000
    14	2012-03-07	13.0000	Beth	205.0000	61.0000
    15	2012-03-07	16.0000	Sam	205.0000	76.0000
    */
    
    /*****************************************
    2012 Aggregate with ROWS
    *****************************************/
    
    with CTEOrders as
    	(select cast(1 as int) as OrderID, cast('3/1/2012' as date) as OrderDate, cast(10.00 as money) as OrderAmt, 'Joe' as CustomerName
    	union select 2, '3/1/2012', 11.00, 'Sam'
    	union select 3, '3/2/2012', 10.00, 'Beth'
    	union select 4, '3/2/2012', 15.00, 'Joe'
    	union select 5, '3/2/2012', 17.00, 'Sam'
    	union select 6, '3/3/2012', 12.00, 'Joe'
    	union select 7, '3/4/2012', 10.00, 'Beth'
    	union select 8, '3/4/2012', 18.00, 'Sam'
    	union select 9, '3/4/2012', 12.00, 'Joe'
    	union select 10, '3/4/2012', 11.00, 'Beth'
    	union select 11, '3/5/2012', 14.00, 'Sam'
    	union select 12, '3/6/2012', 17.00, 'Beth'
    	union select 13, '3/6/2012', 19.00, 'Joe'
    	union select 14, '3/7/2012', 13.00, 'Beth'
    	union select 15, '3/7/2012', 16.00, 'Sam'
    	)
    select OrderID
    	,OrderDate
    	,OrderAmt
    	,CustomerName 
    	,SUM(OrderAmt) OVER (PARTITION BY CustomerName ORDER BY OrderDate, OrderID ROWS 1 PRECEDING) as LastTwoAmts
    	,SUM(OrderAmt) OVER (PARTITION BY CustomerName ORDER BY OrderDate, OrderID ROWS BETWEEN 1 FOLLOWING and 2 FOLLOWING) as NextTwoAmts
    	,SUM(OrderAmt) OVER (PARTITION BY CustomerName ORDER BY OrderDate, OrderID ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) as CurrAndNextTwoAmts
       from CTEOrders
       order by CustomerName, OrderDate, OrderID
    ;
    /*
    
    OrderID	OrderDate	OrderAmt	CustomerName	LastTwoAmts	NextTwoAmts	CurrAndNextTwoAmts
    3	2012-03-02	10.0000	Beth	10.0000	21.0000	31.0000
    7	2012-03-04	10.0000	Beth	20.0000	28.0000	38.0000
    10	2012-03-04	11.0000	Beth	21.0000	30.0000	41.0000
    12	2012-03-06	17.0000	Beth	28.0000	13.0000	30.0000
    14	2012-03-07	13.0000	Beth	30.0000	NULL	13.0000
    1	2012-03-01	10.0000	Joe	10.0000	27.0000	37.0000
    4	2012-03-02	15.0000	Joe	25.0000	24.0000	39.0000
    6	2012-03-03	12.0000	Joe	27.0000	31.0000	43.0000
    9	2012-03-04	12.0000	Joe	24.0000	19.0000	31.0000
    13	2012-03-06	19.0000	Joe	31.0000	NULL	19.0000
    2	2012-03-01	11.0000	Sam	11.0000	35.0000	46.0000
    5	2012-03-02	17.0000	Sam	28.0000	32.0000	49.0000
    8	2012-03-04	18.0000	Sam	35.0000	30.0000	48.0000
    11	2012-03-05	14.0000	Sam	32.0000	16.0000	30.0000
    15	2012-03-07	16.0000	Sam	30.0000	NULL	16.0000
    */
    
    /*****************************************
    2012 Aggregate with RANGE
    *****************************************/
    
    with CTEOrders as
    	(select cast(1 as int) as OrderID, cast('3/1/2012' as date) as OrderDate, cast(10.00 as money) as OrderAmt, 'Joe' as CustomerName
    	union select 2, '3/1/2012', 11.00, 'Sam'
    	union select 3, '3/2/2012', 10.00, 'Beth'
    	union select 4, '3/2/2012', 15.00, 'Joe'
    	union select 5, '3/2/2012', 17.00, 'Sam'
    	union select 6, '3/3/2012', 12.00, 'Joe'
    	union select 7, '3/4/2012', 10.00, 'Beth'
    	union select 8, '3/4/2012', 18.00, 'Sam'
    	union select 9, '3/4/2012', 12.00, 'Joe'
    	union select 10, '3/4/2012', 11.00, 'Beth'
    	union select 11, '3/5/2012', 14.00, 'Sam'
    	union select 12, '3/6/2012', 17.00, 'Beth'
    	union select 13, '3/6/2012', 19.00, 'Joe'
    	union select 14, '3/7/2012', 13.00, 'Beth'
    	union select 15, '3/7/2012', 16.00, 'Sam'
    	)
    select OrderID
    	,OrderDate
    	,OrderAmt
    	,CustomerName 
    	,SUM(OrderAmt) OVER (PARTITION BY CustomerName ORDER BY OrderDate, OrderID RANGE BETWEEN UNBOUNDED PRECEDING and CURRENT ROW) as RunningTotalAmt
       from CTEOrders
       order by CustomerName, OrderDate, OrderID
    ;
    /*
    OrderID	OrderDate	OrderAmt	CustomerName	RunningTotalAmt
    3	2012-03-02	10.0000	Beth	10.0000
    7	2012-03-04	10.0000	Beth	20.0000
    10	2012-03-04	11.0000	Beth	31.0000
    12	2012-03-06	17.0000	Beth	48.0000
    14	2012-03-07	13.0000	Beth	61.0000
    1	2012-03-01	10.0000	Joe	10.0000
    4	2012-03-02	15.0000	Joe	25.0000
    6	2012-03-03	12.0000	Joe	37.0000
    9	2012-03-04	12.0000	Joe	49.0000
    13	2012-03-06	19.0000	Joe	68.0000
    2	2012-03-01	11.0000	Sam	11.0000
    5	2012-03-02	17.0000	Sam	28.0000
    8	2012-03-04	18.0000	Sam	46.0000
    11	2012-03-05	14.0000	Sam	60.0000
    15	2012-03-07	16.0000	Sam	76.0000
    */
    
    /*****************************************
    2012 Aggregate with CURRENT ROW
    RANGE with Only CURRENT ROW specified - aggregates 
    based on PARTITION and ORDER BY clauses
    ROWS with Only CURRENT ROW specified - aggregates 
    the current row only (or no aggregation)
    
    *****************************************/
    with CTEOrders as
    	(select cast(1 as int) as OrderID, cast('3/1/2012' as date) as OrderDate, cast(10.00 as money) as OrderAmt, 'Joe' as CustomerName
    	union select 2, '3/1/2012', 11.00, 'Sam'
    	union select 3, '3/2/2012', 10.00, 'Beth'
    	union select 4, '3/2/2012', 15.00, 'Joe'
    	union select 5, '3/2/2012', 17.00, 'Sam'
    	union select 6, '3/3/2012', 12.00, 'Joe'
    	union select 7, '3/4/2012', 10.00, 'Beth'
    	union select 8, '3/4/2012', 18.00, 'Sam'
    	union select 9, '3/4/2012', 12.00, 'Joe'
    	union select 10, '3/4/2012', 11.00, 'Beth'
    	union select 11, '3/5/2012', 14.00, 'Sam'
    	union select 12, '3/6/2012', 17.00, 'Beth'
    	union select 13, '3/6/2012', 19.00, 'Joe'
    	union select 14, '3/7/2012', 13.00, 'Beth'
    	union select 15, '3/7/2012', 16.00, 'Sam'
    	)
    select OrderID
    	,OrderDate
    	,OrderAmt
    	,CustomerName 
    	,SUM(OrderAmt) OVER (PARTITION BY CustomerName ORDER BY OrderDate RANGE CURRENT ROW) as RunningTotalAmtRange
    	,SUM(OrderAmt) OVER (PARTITION BY CustomerName ORDER BY OrderDate ROWS CURRENT ROW) as RunningTotalAmtRow
       from CTEOrders
       order by CustomerName, OrderDate, OrderID
    ;
    /*
    OrderID	OrderDate	OrderAmt	CustomerName	RunningTotalAmtRange	RunningTotalAmtRow
    3	2012-03-02	10.0000	Beth	10.0000	10.0000
    7	2012-03-04	10.0000	Beth	21.0000	10.0000
    10	2012-03-04	11.0000	Beth	21.0000	11.0000
    12	2012-03-06	17.0000	Beth	17.0000	17.0000
    14	2012-03-07	13.0000	Beth	13.0000	13.0000
    1	2012-03-01	10.0000	Joe	10.0000	10.0000
    4	2012-03-02	15.0000	Joe	15.0000	15.0000
    6	2012-03-03	12.0000	Joe	12.0000	12.0000
    9	2012-03-04	12.0000	Joe	12.0000	12.0000
    13	2012-03-06	19.0000	Joe	19.0000	19.0000
    2	2012-03-01	11.0000	Sam	11.0000	11.0000
    5	2012-03-02	17.0000	Sam	17.0000	17.0000
    8	2012-03-04	18.0000	Sam	18.0000	18.0000
    11	2012-03-05	14.0000	Sam	14.0000	14.0000
    15	2012-03-07	16.0000	Sam	16.0000	16.0000
    */
    
    
    /*****************************************
    2012 Analytic functions
    *****************************************/
    
    with CTEOrders as
    	(select cast(1 as int) as OrderID, cast('3/1/2012' as date) as OrderDate, cast(10.00 as money) as OrderAmt, 'Joe' as CustomerName
    	union select 2, '3/1/2012', 11.00, 'Sam'
    	union select 3, '3/2/2012', 10.00, 'Beth'
    	union select 4, '3/2/2012', 15.00, 'Joe'
    	union select 5, '3/2/2012', 17.00, 'Sam'
    	union select 6, '3/3/2012', 12.00, 'Joe'
    	union select 7, '3/4/2012', 10.00, 'Beth'
    	union select 8, '3/4/2012', 18.00, 'Sam'
    	union select 9, '3/4/2012', 12.00, 'Joe'
    	union select 10, '3/4/2012', 11.00, 'Beth'
    	union select 11, '3/5/2012', 14.00, 'Sam'
    	union select 12, '3/6/2012', 17.00, 'Beth'
    	union select 13, '3/6/2012', 19.00, 'Joe'
    	union select 14, '3/7/2012', 13.00, 'Beth'
    	union select 15, '3/7/2012', 16.00, 'Sam'
    	)
    select OrderID
    	,OrderDate
    	,OrderAmt
    	,CustomerName 
    	,LAG(OrderAmt) OVER (ORDER BY OrderDate, OrderID) as PrevOrderAmt
    	,LEAD(OrderAmt) OVER (PARTITION BY CustomerName ORDER BY OrderDate, OrderID) as NextAmtForCustomer
    	,LAG(OrderID, 2) OVER (PARTITION BY CustomerName ORDER BY OrderDate, OrderID) as TwoOrdersAgoID
    	,LAG(OrderAmt,1, 0) OVER (PARTITION BY CustomerName ORDER BY OrderDate, OrderID) as PrevOrderAmtDef0
    	,LAG(OrderDate, 2, '9999-12-31') OVER (PARTITION BY CustomerName ORDER BY OrderID) as NextTwoOrdDtNoNull
    	,FIRST_VALUE(OrderDate) OVER (ORDER BY OrderID) as FirstOrdDt
    	,LAST_VALUE(CustomerName) OVER (PARTITION BY OrderDate ORDER BY OrderID) as LastCustToOrdByDay
    	,LAG(OrderAmt,(select count(*)-1 from CTEOrders c where c.CustomerName = CTEOrders.CustomerName) , 0) OVER (PARTITION BY CustomerName ORDER BY OrderDate, OrderID) as FirstOrderAmt -- works on last row only here
       from CTEOrders
       order by CustomerName, OrderDate, OrderID;
    /*
    OrderID	OrderDate	OrderAmt	CustomerName	PrevOrderAmt	NextAmtForCustomer	TwoOrdersAgoID	PrevOrderAmtDef0	NextTwoOrdDtNoNull	FirstOrdDt	LastCustToOrdByDay	FirstOrderAmt
    3	2012-03-02	10.0000	Beth	11.0000	10.0000	NULL	0.0000	9999-12-31	2012-03-01	Beth	0.0000
    7	2012-03-04	10.0000	Beth	12.0000	11.0000	NULL	10.0000	9999-12-31	2012-03-01	Beth	0.0000
    10	2012-03-04	11.0000	Beth	12.0000	17.0000	3	10.0000	2012-03-02	2012-03-01	Beth	0.0000
    12	2012-03-06	17.0000	Beth	14.0000	13.0000	7	11.0000	2012-03-04	2012-03-01	Beth	0.0000
    14	2012-03-07	13.0000	Beth	19.0000	NULL	10	17.0000	2012-03-04	2012-03-01	Beth	10.0000
    1	2012-03-01	10.0000	Joe	NULL	15.0000	NULL	0.0000	9999-12-31	2012-03-01	Joe	0.0000
    4	2012-03-02	15.0000	Joe	10.0000	12.0000	NULL	10.0000	9999-12-31	2012-03-01	Joe	0.0000
    6	2012-03-03	12.0000	Joe	17.0000	12.0000	1	15.0000	2012-03-01	2012-03-01	Joe	0.0000
    9	2012-03-04	12.0000	Joe	18.0000	19.0000	4	12.0000	2012-03-02	2012-03-01	Joe	0.0000
    13	2012-03-06	19.0000	Joe	17.0000	NULL	6	12.0000	2012-03-03	2012-03-01	Joe	10.0000
    2	2012-03-01	11.0000	Sam	10.0000	17.0000	NULL	0.0000	9999-12-31	2012-03-01	Sam	0.0000
    5	2012-03-02	17.0000	Sam	15.0000	18.0000	NULL	11.0000	9999-12-31	2012-03-01	Sam	0.0000
    8	2012-03-04	18.0000	Sam	10.0000	14.0000	2	17.0000	2012-03-01	2012-03-01	Sam	0.0000
    11	2012-03-05	14.0000	Sam	11.0000	16.0000	5	18.0000	2012-03-02	2012-03-01	Sam	0.0000
    15	2012-03-07	16.0000	Sam	13.0000	NULL	8	14.0000	2012-03-04	2012-03-01	Sam	11.0000
    */
    with CTEOrders as
    	(select cast(1 as int) as OrderID, cast('3/1/2012' as date) as OrderDate, cast(10.00 as money) as OrderAmt, 'Joe' as CustomerName
    	union select 2, '3/1/2012', 11.00, 'Sam'
    	union select 3, '3/2/2012', 10.00, 'Beth'
    	union select 4, '3/2/2012', 15.00, 'Joe'
    	union select 5, '3/2/2012', 17.00, 'Sam'
    	union select 6, '3/3/2012', 12.00, 'Joe'
    	union select 7, '3/4/2012', 10.00, 'Beth'
    	union select 8, '3/4/2012', 18.00, 'Sam'
    	union select 9, '3/4/2012', 12.00, 'Joe'
    	union select 10, '3/4/2012', 11.00, 'Beth'
    	union select 11, '3/5/2012', 14.00, 'Sam'
    	union select 12, '3/6/2012', 17.00, 'Beth'
    	union select 13, '3/6/2012', 19.00, 'Joe'
    	union select 14, '3/7/2012', 13.00, 'Beth'
    	union select 15, '3/7/2012', 16.00, 'Sam'
    	)
    , CTEOrderAnalytics as (
    select OrderID
    	,OrderDate
    	,OrderAmt
    	,CustomerName 
    	,COUNT(*) OVER (PARTITION BY  CustomerName ORDER BY OrderDate, OrderID) as RunningCount
    	,LAG(OrderAmt,(select count(*)-1 from CTEOrders c where c.CustomerName = CTEOrders.CustomerName) , 0) OVER (PARTITION BY CustomerName ORDER BY OrderDate, OrderID) as FirstOrderAmt -- works on last row only here
       from CTEOrders
       )
    select * 
    	,LAG(OrderAmt,(select RunningCount-1 from CTEOrderAnalytics c where c.CustomerName = CTEOrderAnalytics.CustomerName
    						and c.OrderID = CTEOrderAnalytics.OrderID) , 0) OVER (PARTITION BY CustomerName ORDER BY OrderDate, OrderID) as FirstOrderAmt -- works on last row only here
    	,FIRST_VALUE(OrderAmt) OVER (PARTITION BY CustomerName ORDER BY OrderDate, OrderID) as FirstOrderAmtEasy
    from CTEOrderAnalytics;
    /*
    OrderID	OrderDate	OrderAmt	CustomerName	RunningCount	FirstOrderAmt	FirstOrderAmt	FirstOrderAmtEasy
    3	2012-03-02	10.0000	Beth	1	0.0000	10.0000	10.0000
    7	2012-03-04	10.0000	Beth	2	0.0000	10.0000	10.0000
    10	2012-03-04	11.0000	Beth	3	0.0000	10.0000	10.0000
    12	2012-03-06	17.0000	Beth	4	0.0000	10.0000	10.0000
    14	2012-03-07	13.0000	Beth	5	10.0000	10.0000	10.0000
    1	2012-03-01	10.0000	Joe	1	0.0000	10.0000	10.0000
    4	2012-03-02	15.0000	Joe	2	0.0000	10.0000	10.0000
    6	2012-03-03	12.0000	Joe	3	0.0000	10.0000	10.0000
    9	2012-03-04	12.0000	Joe	4	0.0000	10.0000	10.0000
    13	2012-03-06	19.0000	Joe	5	10.0000	10.0000	10.0000
    2	2012-03-01	11.0000	Sam	1	0.0000	11.0000	11.0000
    5	2012-03-02	17.0000	Sam	2	0.0000	11.0000	11.0000
    8	2012-03-04	18.0000	Sam	3	0.0000	11.0000	11.0000
    11	2012-03-05	14.0000	Sam	4	0.0000	11.0000	11.0000
    15	2012-03-07	16.0000	Sam	5	11.0000	11.0000	11.0000
    */
    /******************************
    CUME_DIST and PCT_RANK
    ******************************/
    
    with CTEOrders as
    	(select cast(1 as int) as OrderID, cast('3/1/2012' as date) as OrderDate, cast(10.00 as money) as OrderAmt, 'Joe' as CustomerName
    	union select 2, '3/1/2012', 11.00, 'Sam'
    	union select 3, '3/2/2012', 10.00, 'Beth'
    	union select 4, '3/2/2012', 15.00, 'Joe'
    	union select 5, '3/2/2012', 17.00, 'Sam'
    	union select 6, '3/3/2012', 12.00, 'Joe'
    	union select 7, '3/4/2012', 10.00, 'Beth'
    	union select 8, '3/4/2012', 18.00, 'Sam'
    	union select 9, '3/4/2012', 12.00, 'Joe'
    	union select 10, '3/4/2012', 11.00, 'Beth'
    	union select 11, '3/5/2012', 14.00, 'Sam'
    	union select 12, '3/6/2012', 17.00, 'Beth'
    	union select 13, '3/6/2012', 19.00, 'Joe'
    	union select 14, '3/7/2012', 13.00, 'Beth'
    	union select 15, '3/7/2012', 16.00, 'Sam'
    	)
    select OrderID
    	,OrderDate
    	,OrderAmt
    	,CustomerName 
    	,CUME_DIST() OVER (ORDER BY OrderAmt) CumDist
    	,PERCENT_RANK() OVER (ORDER BY OrderAmt) PctRank
    from CTEOrders
    /*
    1	2012-03-01	10.0000	Joe	0.2	0
    3	2012-03-02	10.0000	Beth	0.2	0
    7	2012-03-04	10.0000	Beth	0.2	0
    2	2012-03-01	11.0000	Sam	0.333333333333333	0.214285714285714
    10	2012-03-04	11.0000	Beth	0.333333333333333	0.214285714285714
    6	2012-03-03	12.0000	Joe	0.466666666666667	0.357142857142857
    9	2012-03-04	12.0000	Joe	0.466666666666667	0.357142857142857
    14	2012-03-07	13.0000	Beth	0.533333333333333	0.5
    11	2012-03-05	14.0000	Sam	0.6	0.571428571428571
    4	2012-03-02	15.0000	Joe	0.666666666666667	0.642857142857143
    15	2012-03-07	16.0000	Sam	0.733333333333333	0.714285714285714
    5	2012-03-02	17.0000	Sam	0.866666666666667	0.785714285714286
    12	2012-03-06	17.0000	Beth	0.866666666666667	0.785714285714286
    8	2012-03-04	18.0000	Sam	0.933333333333333	0.928571428571429
    13	2012-03-06	19.0000	Joe	1	1
    */
    /******************************
    PERCENTILE_CONT and PERCENTILE_DISC
    ******************************/
    with CTEOrders as
    	(select cast(1 as int) as OrderID, cast('3/1/2012' as date) as OrderDate, cast(10.00 as money) as OrderAmt, 'Joe' as CustomerName
    	union select 2, '3/1/2012', 11.00, 'Sam'
    	union select 3, '3/2/2012', 10.00, 'Beth'
    	union select 4, '3/2/2012', 15.00, 'Joe'
    	union select 5, '3/2/2012', 17.00, 'Sam'
    	union select 6, '3/3/2012', 12.00, 'Joe'
    	union select 7, '3/4/2012', 10.00, 'Beth'
    	union select 8, '3/4/2012', 18.00, 'Sam'
    	union select 9, '3/4/2012', 12.00, 'Joe'
    	union select 10, '3/4/2012', 11.00, 'Beth'
    	union select 11, '3/5/2012', 14.00, 'Sam'
    	union select 12, '3/6/2012', 17.00, 'Beth'
    	union select 13, '3/6/2012', 19.00, 'Joe'
    	union select 14, '3/7/2012', 13.00, 'Beth'
    	union select 15, '3/7/2012', 16.00, 'Sam'
    	)
    	select OrderID as ID
    	,OrderDate as ODt
    	,OrderAmt as OAmt
    	,CustomerName as CName
    	,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY OrderAmt) OVER () PerCont05
    	,PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY OrderAmt) OVER () PerDisc05
    	,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY OrderAmt) OVER (PARTITION BY OrderDate) PerContDt
    	,PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY OrderAmt) OVER (PARTITION BY OrderDate) PerDiscDt
    	,PERCENTILE_CONT(0) WITHIN GROUP (ORDER BY OrderAmt) OVER() PerCont0
    from CTEOrders;
    
    /*
    ID	ODt	OAmt	CName	PerCont05	PerDisc05	PerContDt	PerDiscDt	PerCont0
    1	2012-03-01	10.0000	Joe	13	13.0000	10.5	10.0000	10
    2	2012-03-01	11.0000	Sam	13	13.0000	10.5	10.0000	10
    3	2012-03-02	10.0000	Beth	13	13.0000	15	15.0000	10
    4	2012-03-02	15.0000	Joe	13	13.0000	15	15.0000	10
    5	2012-03-02	17.0000	Sam	13	13.0000	15	15.0000	10
    6	2012-03-03	12.0000	Joe	13	13.0000	12	12.0000	10
    7	2012-03-04	10.0000	Beth	13	13.0000	11.5	11.0000	10
    10	2012-03-04	11.0000	Beth	13	13.0000	11.5	11.0000	10
    9	2012-03-04	12.0000	Joe	13	13.0000	11.5	11.0000	10
    8	2012-03-04	18.0000	Sam	13	13.0000	11.5	11.0000	10
    11	2012-03-05	14.0000	Sam	13	13.0000	14	14.0000	10
    12	2012-03-06	17.0000	Beth	13	13.0000	18	17.0000	10
    13	2012-03-06	19.0000	Joe	13	13.0000	18	17.0000	10
    14	2012-03-07	13.0000	Beth	13	13.0000	14.5	13.0000	10
    15	2012-03-07	16.0000	Sam	13	13.0000	14.5	13.0000	10
    */


  • 相关阅读:
    Java程序语言的后门-反射机制
    JAVA设计模式-单例模式(Singleton)线程安全与效率
    JAVA设计模式-动态代理(Proxy)源码分析
    Mybatis源码解析,一步一步从浅入深(七):执行查询
    Mybatis源码解析,一步一步从浅入深(六):映射代理类的获取
    python程序中的进程操作
    进程
    操作系统的发展史
    详尽实用的 PyCharm 教程
    python的socketserver模块实现TCP/UDP并发
  • 原文地址:https://www.cnblogs.com/Roy_88/p/5463053.html
Copyright © 2011-2022 走看看