Logo

SQL Server RunningCOVAR Function

Updated 2023-11-14 14:34:52.970000

Description

Use the scalar function to calculate the covariance through data points in y- and x-values within a resultant table or partition, without the need for a self-join. The covariance is calculated from the first row of the resultant table or partition through to the current row. If the column values are presented to the functions out of order, an error message will be generated.

Syntax

SELECT [westclintech].[wct].[RunningCOVAR](
  <@Y, float,>
 ,<@X, float,>
 ,<@RowNum, int,>
 ,<@Id, tinyint,>)

Arguments

@Y

the y-value passed into the function. @Y is an expression of type float or of a type that can be implicitly converted to float.

@X

the x-value passed into the function. @X is an expression of type float or of a type that can be implicitly converted to float.

@RowNum

the number of the row within the group for which the sum is being calculated. If @RowNum for the current row in a set is less than or equal to the previous @RowNum and @RowNum is not equal to 1, an error message will be generated. @RowNum is an expression of type int or of a type that can be implicitly converted to int.

@Id

a unique identifier for the RunningCOVAR calculation. @Id allows you to specify multiple RunningCOVAR calculations within a resultant table. @Id is an expression of type tinyint or of a type that can be implicitly converted to tinyint.

Return Type

float

Remarks

If @Id is NULL then @Id = 0.

@RowNum must be in ascending order.

To calculate the covariance over a window of x- and y-values use the MovingCOVAR function.

If @RowNum = 1 then RunningCOVAR is NULL.

To calculate a single covariance value for an entire set of data use the COVAR function.

There may be cases where the order in which the data are returned to the function and the order in which the results are returned are different, generally due to parallelism. You can use OPTION(MAXDOP 1) or OPTION(MAXDOP 1,FORCE ORDER) to help eliminate this problem.

Examples

In this example we will calculate the covariance between square footage and house prices. We will create a temporary table, #se, populate it with some data and then run the SELECT.

SET NOCOUNT ON;
--Create the temporary table
CREATE TABLE #se
(
    rn int,
    id_lot int,
    amt_sqft int,
    amt_price int,
    PRIMARY KEY (rn)
);
--Put some date in the table
INSERT INTO #se
VALUES
(1, 21783, 1147, 393918);
INSERT INTO #se
VALUES
(2, 94729, 1313, 470479);
INSERT INTO #se
VALUES
(3, 33028, 1433, 512474);
INSERT INTO #se
VALUES
(4, 59446, 1724, 610477);
INSERT INTO #se
VALUES
(5, 97646, 1162, 388196);
INSERT INTO #se
VALUES
(6, 44823, 1813, 636916);
INSERT INTO #se
VALUES
(7, 88397, 1105, 374348);
INSERT INTO #se
VALUES
(8, 13588, 1555, 559149);
INSERT INTO #se
VALUES
(9, 13891, 1775, 623900);
INSERT INTO #se
VALUES
(10, 90957, 1585, 563947);
INSERT INTO #se
VALUES
(11, 44167, 1510, 529806);
INSERT INTO #se
VALUES
(12, 75533, 1628, 592533);
INSERT INTO #se
VALUES
(13, 56812, 1145, 408634);
INSERT INTO #se
VALUES
(14, 12897, 1632, 589522);
INSERT INTO #se
VALUES
(15, 93826, 1850, 668852);
INSERT INTO #se
VALUES
(16, 74510, 1867, 633400);
INSERT INTO #se
VALUES
(17, 17262, 1587, 552178);
INSERT INTO #se
VALUES
(18, 30929, 1809, 633141);
INSERT INTO #se
VALUES
(19, 49030, 1521, 555713);
INSERT INTO #se
VALUES
(20, 33431, 1195, 434542);
--Calculate CORREL
SELECT rn,
       id_lot,
       amt_sqft,
       amt_price,
       wct.RunningCOVAR(amt_price, amt_sqft, ROW_NUMBER() OVER (ORDER BY rn), 
                 NULL) as CORREL
FROM #se;
--Clean up
DROP TABLE #se;

This produces the following result.

rnid_lotamt_sqftamt_priceCOVAR
12178311473939180
29472913134704793177281.5
33302814335124745739504.66666667
459446172461047716416758.5
597646116238819617344331.96
644823181363691624728367.1666667
788397110537434826310103.3673469
813588155555914924419454.6875
913891177562390026461392.382716
1090957158556394724510824.82
1144167151052980622348813.4132231
1275533162859253321449604.125
1356812114540863422474025.7751479
1412897163258952221778746.0255102
1593826185066885223925253.9466667
1674510186763340024742460.515625
1717262158755217823356114.4290657
1830929180963314123537179.2222222
1949030152155571322287858.2216066
2033431119543454222907483.2