Logo

SQL Server RunningINTERCEPT Function

Updated 2023-11-14 14:48:39.517000

Description

Use the scalar function to calculate the intercept of a series of x- and y-values within a resultant table or partition, without the need for a self-join. The intercept value 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].[RunningINTERCEPT](
  <@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 RunningINTERCEPT calculation. @Id allows you to specify multiple RunningINTERCEPT 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 intercept over a window of x- and y-values use the MovingINTERCEPT function.

If @RowNum = 1 then RunningINTERCEPT is NULL.

To calculate a single intercept value for a set of data use the INTERCEPT 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 intercept, over time, in the closing prices for some stock indices. We will create a temporary table, #p, populate it with some data and then run the SELECT.

--Create the temporary table
CREATE TABLE #p
(
    ticker varchar(4),
    date_trade datetime,
    price_open money,
    price_high money,
    price_low money,
    price_close money,
    volume bigint,
    price_adj_close money,
    PRIMARY KEY (
                    ticker,
                    date_trade
                )
);
--Populate the table with some data
INSERT INTO #p
VALUES
('GSPC', '2012-10-26', 1412.97, 1417.09, 1403.28, 1411.94, 3284910000, 1411.94);
INSERT INTO #p
VALUES
('GSPC', '2012-10-25', 1409.74, 1421.12, 1405.14, 1412.97, 3512640000, 1412.97);
INSERT INTO #p
VALUES
('GSPC', '2012-10-24', 1413.2, 1420.04, 1407.1, 1408.75, 3385970000, 1408.75);
INSERT INTO #p
VALUES
('GSPC', '2012-10-23', 1433.74, 1433.74, 1407.56, 1413.11, 3587670000, 1413.11);
INSERT INTO #p
VALUES
('GSPC', '2012-10-22', 1433.21, 1435.46, 1422.06, 1433.81, 3216220000, 1433.81);
INSERT INTO #p
VALUES
('GSPC', '2012-10-19', 1457.34, 1457.34, 1429.85, 1433.19, 3875170000, 1433.19);
INSERT INTO #p
VALUES
('GSPC', '2012-10-18', 1460.94, 1464.02, 1452.63, 1457.34, 3880030000, 1457.34);
INSERT INTO #p
VALUES
('GSPC', '2012-10-17', 1454.22, 1462.2, 1453.35, 1460.91, 3655320000, 1460.91);
INSERT INTO #p
VALUES
('GSPC', '2012-10-16', 1440.31, 1455.51, 1440.31, 1454.92, 3568770000, 1454.92);
INSERT INTO #p
VALUES
('GSPC', '2012-10-15', 1428.75, 1441.31, 1427.24, 1440.13, 3483810000, 1440.13);
INSERT INTO #p
VALUES
('GSPC', '2012-10-12', 1432.84, 1438.43, 1425.53, 1428.59, 3134750000, 1428.59);
INSERT INTO #p
VALUES
('GSPC', '2012-10-11', 1432.82, 1443.9, 1432.82, 1432.84, 3672540000, 1432.84);
INSERT INTO #p
VALUES
('GSPC', '2012-10-10', 1441.48, 1442.52, 1430.64, 1432.56, 3225060000, 1432.56);
INSERT INTO #p
VALUES
('GSPC', '2012-10-09', 1455.9, 1455.9, 1441.18, 1441.48, 3216320000, 1441.48);
INSERT INTO #p
VALUES
('GSPC', '2012-10-08', 1460.93, 1460.93, 1453.1, 1455.88, 2328720000, 1455.88);
INSERT INTO #p
VALUES
('GSPC', '2012-10-05', 1461.4, 1470.96, 1456.89, 1460.93, 3172940000, 1460.93);
INSERT INTO #p
VALUES
('GSPC', '2012-10-04', 1451.08, 1463.14, 1451.08, 1461.4, 3615860000, 1461.4);
INSERT INTO #p
VALUES
('GSPC', '2012-10-03', 1446.05, 1454.3, 1441.99, 1450.99, 3531640000, 1450.99);
INSERT INTO #p
VALUES
('GSPC', '2012-10-02', 1444.99, 1451.52, 1439.01, 1445.75, 3321790000, 1445.75);
INSERT INTO #p
VALUES
('GSPC', '2012-10-01', 1440.9, 1457.14, 1440.9, 1444.49, 3505080000, 1444.49);
INSERT INTO #p
VALUES
('GSPC', '2012-09-28', 1447.13, 1447.13, 1435.6, 1440.67, 3509230000, 1440.67);
INSERT INTO #p
VALUES
('GSPC', '2012-09-27', 1433.36, 1450.2, 1433.36, 1447.15, 3150330000, 1447.15);
INSERT INTO #p
VALUES
('GSPC', '2012-09-26', 1441.6, 1441.6, 1430.53, 1433.32, 3565380000, 1433.32);
INSERT INTO #p
VALUES
('GSPC', '2012-09-25', 1456.94, 1463.24, 1441.59, 1441.59, 3739900000, 1441.59);
INSERT INTO #p
VALUES
('GSPC', '2012-09-24', 1459.76, 1460.72, 1452.06, 1456.89, 3008920000, 1456.89);
INSERT INTO #p
VALUES
('GSPC', '2012-09-21', 1460.34, 1467.07, 1459.51, 1460.15, 4833870000, 1460.15);
INSERT INTO #p
VALUES
('GSPC', '2012-09-20', 1461.05, 1461.23, 1449.98, 1460.26, 3382520000, 1460.26);
INSERT INTO #p
VALUES
('GSPC', '2012-09-19', 1459.5, 1465.15, 1457.88, 1461.05, 3451360000, 1461.05);
INSERT INTO #p
VALUES
('GSPC', '2012-09-18', 1461.19, 1461.47, 1456.13, 1459.32, 3377390000, 1459.32);
INSERT INTO #p
VALUES
('GSPC', '2012-09-17', 1465.42, 1465.63, 1457.55, 1461.19, 3482430000, 1461.19);
INSERT INTO #p
VALUES
('GSPC', '2012-09-14', 1460.07, 1474.51, 1460.07, 1465.77, 5041990000, 1465.77);
INSERT INTO #p
VALUES
('GSPC', '2012-09-13', 1436.56, 1463.76, 1435.34, 1459.99, 4606550000, 1459.99);
INSERT INTO #p
VALUES
('GSPC', '2012-09-12', 1433.56, 1439.15, 1432.99, 1436.56, 3641200000, 1436.56);
INSERT INTO #p
VALUES
('GSPC', '2012-09-11', 1429.13, 1437.76, 1429.13, 1433.56, 3509630000, 1433.56);
INSERT INTO #p
VALUES
('GSPC', '2012-09-10', 1437.92, 1438.74, 1428.98, 1429.08, 3223670000, 1429.08);
INSERT INTO #p
VALUES
('GSPC', '2012-09-07', 1432.12, 1437.92, 1431.45, 1437.92, 3717620000, 1437.92);
INSERT INTO #p
VALUES
('GSPC', '2012-09-06', 1403.74, 1432.12, 1403.74, 1432.12, 3952870000, 1432.12);
INSERT INTO #p
VALUES
('GSPC', '2012-09-05', 1404.94, 1408.81, 1401.25, 1403.44, 3389110000, 1403.44);
INSERT INTO #p
VALUES
('GSPC', '2012-09-04', 1406.54, 1409.31, 1396.56, 1404.94, 3200310000, 1404.94);
INSERT INTO #p
VALUES
('GSPC', '2012-08-31', 1400.07, 1413.09, 1398.96, 1406.58, 2938250000, 1406.58);
INSERT INTO #p
VALUES
('GSPC', '2012-08-30', 1410.08, 1410.08, 1397.01, 1399.48, 2530280000, 1399.48);
INSERT INTO #p
VALUES
('GSPC', '2012-08-29', 1409.32, 1413.95, 1406.57, 1410.49, 2571220000, 1410.49);
INSERT INTO #p
VALUES
('GSPC', '2012-08-28', 1410.44, 1413.63, 1405.59, 1409.3, 2629090000, 1409.3);
INSERT INTO #p
VALUES
('GSPC', '2012-08-27', 1411.13, 1416.17, 1409.11, 1410.44, 2472500000, 1410.44);
INSERT INTO #p
VALUES
('GSPC', '2012-08-24', 1401.99, 1413.46, 1398.04, 1411.13, 2598790000, 1411.13);
INSERT INTO #p
VALUES
('DJI', '2012-10-26', 13104.22, 13151.72, 13040.17, 13107.21, 1346400, 13107.21);
INSERT INTO #p
VALUES
('DJI', '2012-10-25', 13079.64, 13214.11, 13017.37, 13103.68, 1145900, 13103.68);
INSERT INTO #p
VALUES
('DJI', '2012-10-24', 13103.53, 13155.21, 13063.63, 13077.34, 1106700, 13077.34);
INSERT INTO #p
VALUES
('DJI', '2012-10-23', 13344.9, 13344.9, 13083.28, 13102.53, 1222200, 13102.53);
INSERT INTO #p
VALUES
('DJI', '2012-10-22', 13344.28, 13368.55, 13235.15, 13345.89, 1218800, 13345.89);
INSERT INTO #p
VALUES
('DJI', '2012-10-19', 13545.33, 13545.49, 13312.22, 13343.51, 2390800, 13343.51);
INSERT INTO #p
VALUES
('DJI', '2012-10-18', 13553.24, 13588.73, 13510.93, 13548.94, 1284100, 13548.94);
INSERT INTO #p
VALUES
('DJI', '2012-10-17', 13539.63, 13561.65, 13468.9, 13557, 1355700, 13557);
INSERT INTO #p
VALUES
('DJI', '2012-10-16', 13423.84, 13556.37, 13423.76, 13551.78, 1134500, 13551.78);
INSERT INTO #p
VALUES
('DJI', '2012-10-15', 13329.54, 13437.66, 13325.93, 13424.23, 1148800, 13424.23);
INSERT INTO #p
VALUES
('DJI', '2012-10-12', 13325.62, 13401.32, 13296.43, 13328.85, 1137400, 13328.85);
INSERT INTO #p
VALUES
('DJI', '2012-10-11', 13346.28, 13428.49, 13326.12, 13326.39, 866300, 13326.39);
INSERT INTO #p
VALUES
('DJI', '2012-10-10', 13473.53, 13478.83, 13327.62, 13344.97, 1011200, 13344.97);
INSERT INTO #p
VALUES
('DJI', '2012-10-09', 13582.88, 13592.33, 13473.31, 13473.53, 1036300, 13473.53);
INSERT INTO #p
VALUES
('DJI', '2012-10-08', 13589.26, 13610.38, 13552.09, 13583.65, 713000, 13583.65);
INSERT INTO #p
VALUES
('DJI', '2012-10-05', 13569.18, 13661.87, 13568.75, 13610.15, 1155000, 13610.15);
INSERT INTO #p
VALUES
('DJI', '2012-10-04', 13495.18, 13594.33, 13495.18, 13575.36, 1063900, 13575.36);
INSERT INTO #p
VALUES
('DJI', '2012-10-03', 13479.21, 13536.27, 13439.12, 13494.61, 1038900, 13494.61);
INSERT INTO #p
VALUES
('DJI', '2012-10-02', 13515.3, 13567.06, 13424.92, 13482.36, 907300, 13482.36);
INSERT INTO #p
VALUES
('DJI', '2012-10-01', 13437.66, 13598.25, 13437.66, 13515.11, 1061200, 13515.11);
INSERT INTO #p
VALUES
('DJI', '2012-09-28', 13485.89, 13487.66, 13367.27, 13437.13, 1469500, 13437.13);
INSERT INTO #p
VALUES
('DJI', '2012-09-27', 13413.47, 13522.83, 13413.47, 13485.97, 1139900, 13485.97);
INSERT INTO #p
VALUES
('DJI', '2012-09-26', 13458.63, 13480.37, 13406.91, 13413.51, 1243500, 13413.51);
INSERT INTO #p
VALUES
('DJI', '2012-09-25', 13559.92, 13620.21, 13457.25, 13457.55, 1386300, 13457.55);
INSERT INTO #p
VALUES
('DJI', '2012-09-24', 13577.85, 13601.9, 13521.68, 13558.92, 1203700, 13558.92);
INSERT INTO #p
VALUES
('DJI', '2012-09-21', 13597.24, 13647.1, 13571.53, 13579.47, 4296100, 13579.47);
INSERT INTO #p
VALUES
('DJI', '2012-09-20', 13575.17, 13599.02, 13503, 13596.93, 1179100, 13596.93);
INSERT INTO #p
VALUES
('DJI', '2012-09-19', 13565.41, 13626.48, 13556.74, 13577.96, 1162100, 13577.96);
INSERT INTO #p
VALUES
('DJI', '2012-09-18', 13552.33, 13582.12, 13517.81, 13564.64, 1207200, 13564.64);
INSERT INTO #p
VALUES
('DJI', '2012-09-17', 13588.57, 13593.15, 13526.67, 13553.1, 1280200, 13553.1);
INSERT INTO #p
VALUES
('DJI', '2012-09-14', 13540.4, 13653.24, 13533.94, 13593.37, 1851600, 13593.37);
INSERT INTO #p
VALUES
('DJI', '2012-09-13', 13329.71, 13573.33, 13325.11, 13539.86, 1517700, 13539.86);
INSERT INTO #p
VALUES
('DJI', '2012-09-12', 13321.62, 13373.62, 13317.52, 13333.35, 1115200, 13333.35);
INSERT INTO #p
VALUES
('DJI', '2012-09-11', 13254.6, 13354.34, 13253.21, 13323.36, 1049200, 13323.36);
INSERT INTO #p
VALUES
('DJI', '2012-09-10', 13308.56, 13324.1, 13251.39, 13254.29, 1238100, 13254.29);
INSERT INTO #p
VALUES
('DJI', '2012-09-07', 13289.53, 13320.27, 13266.22, 13306.64, 1422100, 13306.64);
INSERT INTO #p
VALUES
('DJI', '2012-09-06', 13045.23, 13294.13, 13045.08, 13292, 1286500, 13292);
INSERT INTO #p
VALUES
('DJI', '2012-09-05', 13036.09, 13095.91, 13018.74, 13047.48, 925500, 13047.48);
INSERT INTO #p
VALUES
('DJI', '2012-09-04', 13092.15, 13092.39, 12977.09, 13035.94, 1039200, 13035.94);
INSERT INTO #p
VALUES
('DJI', '2012-08-31', 13002.72, 13151.87, 13002.64, 13090.84, 1197800, 13090.84);
INSERT INTO #p
VALUES
('DJI', '2012-08-30', 13101.29, 13101.37, 12978.91, 13000.71, 899800, 13000.71);
INSERT INTO #p
VALUES
('DJI', '2012-08-29', 13103.46, 13144.81, 13081.27, 13107.48, 915300, 13107.48);
INSERT INTO #p
VALUES
('DJI', '2012-08-28', 13122.74, 13147.32, 13081.12, 13102.99, 816300, 13102.99);
INSERT INTO #p
VALUES
('DJI', '2012-08-27', 13157.74, 13176.17, 13115.46, 13124.67, 960700, 13124.67);
INSERT INTO #p
VALUES
('DJI', '2012-08-24', 13052.82, 13175.51, 13027.2, 13157.97, 880300, 13157.97);
INSERT INTO #p
VALUES
('IXIC', '2012-10-26', 2986.05, 2999.14, 2961.16, 2987.95, 1839700000, 2987.95);
INSERT INTO #p
VALUES
('IXIC', '2012-10-25', 3005.04, 3007.71, 2975.98, 2986.12, 1922660000, 2986.12);
INSERT INTO #p
VALUES
('IXIC', '2012-10-24', 3011.82, 3012.95, 2978.73, 2981.7, 1967000000, 2981.7);
INSERT INTO #p
VALUES
('IXIC', '2012-10-23', 2989.44, 3006.59, 2974.07, 2990.46, 1830840000, 2990.46);
INSERT INTO #p
VALUES
('IXIC', '2012-10-22', 3005.92, 3020.61, 2995.78, 3016.96, 1654130000, 3016.96);
INSERT INTO #p
VALUES
('IXIC', '2012-10-19', 3066.56, 3066.56, 3000.27, 3005.62, 2225580000, 3005.62);
INSERT INTO #p
VALUES
('IXIC', '2012-10-18', 3097.77, 3102.56, 3065.24, 3072.87, 2043290000, 3072.87);
INSERT INTO #p
VALUES
('IXIC', '2012-10-17', 3091.38, 3112.45, 3088.05, 3104.12, 1770920000, 3104.12);
INSERT INTO #p
VALUES
('IXIC', '2012-10-16', 3073.21, 3102.97, 3070.25, 3101.17, 1736930000, 3101.17);
INSERT INTO #p
VALUES
('IXIC', '2012-10-15', 3053.21, 3066.31, 3037.27, 3064.18, 1563440000, 3064.18);
INSERT INTO #p
VALUES
('IXIC', '2012-10-12', 3049.08, 3061.77, 3039.58, 3044.11, 1524840000, 3044.11);
INSERT INTO #p
VALUES
('IXIC', '2012-10-11', 3075.89, 3078.08, 3047.14, 3049.41, 1595020000, 3049.41);
INSERT INTO #p
VALUES
('IXIC', '2012-10-10', 3066.25, 3071.57, 3046.78, 3051.78, 1788970000, 3051.78);
INSERT INTO #p
VALUES
('IXIC', '2012-10-09', 3108.01, 3108.01, 3062.52, 3065.02, 1645740000, 3065.02);
INSERT INTO #p
VALUES
('IXIC', '2012-10-08', 3121.33, 3125.49, 3107.57, 3112.35, 1186260000, 3112.35);
INSERT INTO #p
VALUES
('IXIC', '2012-10-05', 3161.21, 3171.46, 3130.76, 3136.19, 1607940000, 3136.19);
INSERT INTO #p
VALUES
('IXIC', '2012-10-04', 3142.38, 3153.48, 3132.56, 3149.46, 1585190000, 3149.46);
INSERT INTO #p
VALUES
('IXIC', '2012-10-03', 3130.85, 3142.36, 3115.04, 3135.23, 1704050000, 3135.23);
INSERT INTO #p
VALUES
('IXIC', '2012-10-02', 3127.73, 3131.64, 3101.64, 3120.04, 1609570000, 3120.04);
INSERT INTO #p
VALUES
('IXIC', '2012-10-01', 3130.31, 3146.99, 3103.89, 3113.53, 1758170000, 3113.53);
INSERT INTO #p
VALUES
('IXIC', '2012-09-28', 3125.31, 3132.51, 3109.91, 3116.23, 1864640000, 3116.23);
INSERT INTO #p
VALUES
('IXIC', '2012-09-27', 3105.87, 3142.02, 3098.46, 3136.6, 1691800000, 3136.6);
INSERT INTO #p
VALUES
('IXIC', '2012-09-26', 3113.4, 3114.54, 3080.28, 3093.7, 1738010000, 3093.7);
INSERT INTO #p
VALUES
('IXIC', '2012-09-25', 3170.37, 3176.3, 3117.73, 3117.73, 1975470000, 3117.73);
INSERT INTO #p
VALUES
('IXIC', '2012-09-24', 3155.35, 3167.74, 3150.71, 3160.78, 1704860000, 3160.78);
INSERT INTO #p
VALUES
('IXIC', '2012-09-21', 3194.86, 3196.93, 3178.09, 3179.96, 2526250000, 3179.96);
INSERT INTO #p
VALUES
('IXIC', '2012-09-20', 3166.84, 3178.45, 3156.46, 3175.96, 1809130000, 3175.96);
INSERT INTO #p
VALUES
('IXIC', '2012-09-19', 3179.04, 3189.35, 3170.29, 3182.62, 1850920000, 3182.62);
INSERT INTO #p
VALUES
('IXIC', '2012-09-18', 3173.62, 3179.37, 3169.41, 3177.8, 1707200000, 3177.8);
INSERT INTO #p
VALUES
('IXIC', '2012-09-17', 3183.4, 3183.4, 3168.63, 3178.67, 1485390000, 3178.67);
INSERT INTO #p
VALUES
('IXIC', '2012-09-14', 3166.24, 3195.67, 3164.26, 3183.95, 1984720000, 3183.95);
INSERT INTO #p
VALUES
('IXIC', '2012-09-13', 3117.66, 3167.63, 3112.62, 3155.83, 1870050000, 3155.83);
INSERT INTO #p
VALUES
('IXIC', '2012-09-12', 3115.33, 3120.12, 3098.82, 3114.31, 1689140000, 3114.31);
INSERT INTO #p
VALUES
('IXIC', '2012-09-11', 3105.02, 3117.86, 3099.1, 3104.53, 1586250000, 3104.53);
INSERT INTO #p
VALUES
('IXIC', '2012-09-10', 3131.34, 3133.89, 3102.76, 3104.02, 1575370000, 3104.02);
INSERT INTO #p
VALUES
('IXIC', '2012-09-07', 3133.22, 3139.61, 3128.17, 3136.42, 1740640000, 3136.42);
INSERT INTO #p
VALUES
('IXIC', '2012-09-06', 3087.94, 3135.81, 3087.67, 3135.81, 1918900000, 3135.81);
INSERT INTO #p
VALUES
('IXIC', '2012-09-05', 3072.58, 3082.75, 3062.54, 3069.27, 1495030000, 3069.27);
INSERT INTO #p
VALUES
('IXIC', '2012-09-04', 3063.25, 3082.26, 3040.24, 3075.06, 1505960000, 3075.06);
INSERT INTO #p
VALUES
('IXIC', '2012-08-31', 3069.64, 3078.52, 3040.59, 3066.96, 1394760000, 3066.96);
INSERT INTO #p
VALUES
('IXIC', '2012-08-30', 3066.73, 3067.54, 3045.92, 3048.71, 1216640000, 3048.71);
INSERT INTO #p
VALUES
('IXIC', '2012-08-29', 3078.05, 3087.24, 3067.62, 3081.19, 1282900000, 3081.19);
INSERT INTO #p
VALUES
('IXIC', '2012-08-28', 3069.4, 3083.19, 3063.65, 3077.14, 1364740000, 3077.14);
INSERT INTO #p
VALUES
('IXIC', '2012-08-27', 3083.62, 3085.81, 3068.13, 3073.19, 1383530000, 3073.19);
INSERT INTO #p
VALUES
('IXIC', '2012-08-24', 3045.22, 3076.8, 3042.22, 3069.79, 1349740000, 3069.79);
--Calculate the INTERCEPT for DJI
SELECT ticker,
       cast(convert(varchar, date_trade, 106) as char(11)) as [trade date],
       price_close as [Closing Price],
       wct.RunningINTERCEPT(price_close, convert(float, date_trade), ROW_NUMBER()
                 over (ORDER BY date_trade ASC), NULL) as [INTERCEPT]
FROM #p
WHERE ticker = 'DJI'
ORDER BY date_trade ASC;
--Clean up
DROP TABLE #p;

This produces the following result.

tickertrade dateClosing PriceINTERCEPT
DJI24 Aug 201213157.97NULL
DJI27 Aug 201213124.67469845.270435983
DJI28 Aug 201213102.99553556.67002926
DJI29 Aug 201213107.48471489.717612114
DJI30 Aug 201213000.71886730.362595414
DJI31 Aug 201213090.84643747.834434902
DJI04 Sep 201213035.94496716.219783845
DJI05 Sep 201213047.48409829.67629724
DJI06 Sep 201213292.00-44403.3721036542
DJI07 Sep 201213306.64-295181.00258685
DJI10 Sep 201213254.29-365672.255742923
DJI11 Sep 201213323.36-460440.019848391
DJI12 Sep 201213333.35-514552.22568212
DJI13 Sep 201213539.86-683767.404199407
DJI14 Sep 201213593.37-820060.033074282
DJI17 Sep 201213553.10-866205.43529188
DJI18 Sep 201213564.64-891149.563633173
DJI19 Sep 201213577.96-904407.788062262
DJI20 Sep 201213596.93-912586.371088695
DJI21 Sep 201213579.47-904107.707349092
DJI24 Sep 201213558.92-865001.306359731
DJI25 Sep 201213457.55-796843.112479794
DJI26 Sep 201213413.51-727242.787132865
DJI27 Sep 201213485.97-688260.220234556
DJI28 Sep 201213437.13-641695.775840377
DJI01 Oct 201213515.11-608651.28756516
DJI02 Oct 201213482.36-572532.852580269
DJI03 Oct 201213494.61-543666.0996033
DJI04 Oct 201213575.36-533112.319923992
DJI05 Oct 201213610.15-528266.52520419
DJI08 Oct 201213583.65-512421.166296604
DJI09 Oct 201213473.53-479867.015023091
DJI10 Oct 201213344.97-432278.517487333
DJI11 Oct 201213326.39-388812.392385628
DJI12 Oct 201213328.85-351505.520000139
DJI15 Oct 201213424.23-326855.07786557
DJI16 Oct 201213551.78-320977.559708114
DJI17 Oct 201213557.00-315715.159740371
DJI18 Oct 201213548.94-309532.33622574
DJI19 Oct 201213343.51-282622.573028647
DJI22 Oct 201213345.89-256077.921588017
DJI23 Oct 201213102.53-209617.30814369
DJI24 Oct 201213077.34-167074.626377353
DJI25 Oct 201213103.68-132248.726298971
DJI26 Oct 201213107.21-102001.494866316

Notice that in the previous example that the interval between dates is unequal because there are no prices for the weekends and holidays. Additionally, since we start so far away from the origin, the intercept value is misleading. To eliminate both problems, we can use the RANK function which will have the effect of equally spacing the x-values and starting almost at the point of origin.

SELECT ticker,
       cast(convert(varchar, date_trade, 106) as char(11)) as [trade date],
       price_close as [Closing Price],
       wct.RunningINTERCEPT(
                               price_close,
                               RANK() over (ORDER BY date_trade ASC),
                               ROW_NUMBER() over (ORDER BY date_trade ASC),
                               NULL
                           ) as [INTERCEPT]
FROM #p
WHERE ticker = 'DJI'
ORDER BY date_trade ASC;

This produces the following result.

tickertrade dateClosing PriceINTERCEPT
DJI24 Aug 201213157.97NULL
DJI27 Aug 201213124.6713191.27
DJI28 Aug 201213102.9913183.5233333333
DJI29 Aug 201213107.4813166.565
DJI30 Aug 201213000.7113198.277
DJI31 Aug 201213090.8413167.7473333333
DJI04 Sep 201213035.9413165.2328571429
DJI05 Sep 201213047.4813156.3832142857
DJI06 Sep 201213292.0013093.8580555555
DJI07 Sep 201213306.6413056.4286666667
DJI10 Sep 201213254.2913045.9969090909
DJI11 Sep 201213323.3613030.5286363636
DJI12 Sep 201213333.3513021.8388461538
DJI13 Sep 201213539.8612989.4581318681
DJI14 Sep 201213593.3712963.5111428571
DJI17 Sep 201213553.1012954.11725
DJI18 Sep 201213564.6412949.91125
DJI19 Sep 201213577.9612949.1502614379
DJI20 Sep 201213596.9312950.2254385965
DJI21 Sep 201213579.4712956.2409473684
DJI24 Sep 201213558.9212966.0641904762
DJI25 Sep 201213457.5512985.9258441558
DJI26 Sep 201213413.5113008.1054940711
DJI27 Sep 201213485.9713022.0994202899
DJI28 Sep 201213437.1313039.3544
DJI01 Oct 201213515.1113049.2333230769
DJI02 Oct 201213482.3613061.4300569801
DJI03 Oct 201213494.6113072.1552380952
DJI04 Oct 201213575.3613076.8990640394
DJI05 Oct 201213610.1513079.8478390804
DJI08 Oct 201213583.6513085.2725806452
DJI09 Oct 201213473.5313097.9174596774
DJI10 Oct 201213344.9713117.5564772727
DJI11 Oct 201213326.3913136.418342246
DJI12 Oct 201213328.8513153.3349747899
DJI15 Oct 201213424.2313163.3785396825
DJI16 Oct 201213551.7813165.8484684685
DJI17 Oct 201213557.0013168.3361593172
DJI18 Oct 201213548.9413171.5099055331
DJI19 Oct 201213343.5113185.1257307692
DJI22 Oct 201213345.8913197.5068414634
DJI23 Oct 201213102.5313220.4840882695
DJI24 Oct 201213077.3413242.3903654485
DJI25 Oct 201213103.6813260.9565750529
DJI26 Oct 201213107.2113277.5754545455

In this example, we calculate the intercept for each of the three indices and compare them side-by-side.

SELECT cast(convert(varchar, p1.date_trade, 106) as char(11)) as [trade date],
       p1.price_close as [S&P],
       p2.price_close as [DJIA],
       p3.price_close as [NASDAQ],
       ROUND(
                wct.RunningINTERCEPT(
                                        p1.price_close,
                                        RANK() over (ORDER BY p1.date_trade ASC),
                                        ROW_NUMBER() over (ORDER BY p1.date_trade 
                                                  ASC),
                                        1
                                    ),
                2
            ) as [S&P b],
       ROUND(
                wct.RunningINTERCEPT(
                                        p2.price_close,
                                        RANK() over (ORDER BY p2.date_trade ASC),
                                        ROW_NUMBER() over (ORDER BY p2.date_trade 
                                                  ASC),
                                        2
                                    ),
                2
            ) as [DJIA b],
       ROUND(
                wct.RunningINTERCEPT(
                                        p3.price_close,
                                        RANK() over (ORDER BY p3.date_trade ASC),
                                        ROW_NUMBER() over (ORDER BY p3.date_trade 
                                                  ASC),
                                        3
                                    ),
                2
            ) as [NASDAQ b]
FROM #p p1
    JOIN #p p2
        ON p2.date_trade = p1.date_trade
           AND p2.ticker = 'DJI'
    JOIN #p p3
        ON p3.date_trade = p1.date_trade
           AND p3.ticker = 'IXIC'
WHERE p1.ticker = 'GSPC';

This produces the following result.

trade dateS&PDJIANASDAQS&P bDJIA bNASDAQ b
24 Aug 20121411.1313157.973069.79NULLNULLNULL
27 Aug 20121410.4413124.673073.191411.8213191.33066.39
28 Aug 20121409.3013102.993077.141412.1213183.53066.02
29 Aug 20121410.4913107.483081.191411.1113166.63065.79
30 Aug 20121399.4813000.713048.711415.1413198.33080.25
31 Aug 20121406.5813090.843066.961413.3513167.83077.85
04 Sep 20121404.9413035.943075.061412.6413165.23073.87
05 Sep 20121403.4413047.483069.271412.3613156.43073.23
06 Sep 20121432.1213292.003135.811405.5713093.93057.96
07 Sep 20121437.9213306.643136.421400.7813056.43050.07
10 Sep 20121429.0813254.293104.021399.93130463052.36
11 Sep 20121433.5613323.363104.531399.0413030.53054.63
12 Sep 20121436.5613333.353114.311398.413021.83055.36
13 Sep 20121459.9913539.863155.83139512989.53050.6
14 Sep 20121465.7713593.373183.951392.3312963.53044.32
17 Sep 20121461.1913553.103178.671391.4912954.13041.39
18 Sep 20121459.3213564.643177.801391.5712949.93040.23
19 Sep 20121461.0513577.963182.621391.8812949.23039.69
20 Sep 20121460.2613596.933175.961392.6212950.23040.79
21 Sep 20121460.1513579.473179.961393.5812956.23041.99
24 Sep 20121456.8913558.923160.781394.9912966.13045.45
25 Sep 20121441.5913457.553117.731397.8112985.93052.71
26 Sep 20121433.3213413.513093.701401.0413008.13061.09
27 Sep 20121447.1513485.973136.601402.7113022.13064.64
28 Sep 20121440.6713437.133116.231404.7913039.43069.5
01 Oct 20121444.4913515.113113.531406.3613049.23073.98
02 Oct 20121445.7513482.363120.041407.7313061.43077.44
03 Oct 20121450.9913494.613135.231408.6313072.23079.45
04 Oct 20121461.4013575.363149.461408.7913076.93080.34
05 Oct 20121460.9313610.153136.191409.0813079.93082.15
08 Oct 20121455.8813583.653112.351409.7813085.33085.39
09 Oct 20121441.4813473.533065.021411.3813097.93091.24
10 Oct 20121432.5613344.973051.781413.3913117.63097.15
11 Oct 20121432.8413326.393049.411415.1813136.43102.43
12 Oct 20121428.5913328.853044.111417.0513153.33107.33
15 Oct 20121440.1313424.233064.181418.0813163.43110.48
16 Oct 20121454.9213551.783101.171418.2413165.93111.23
17 Oct 20121460.9113557.003104.121418.1313168.33111.72
18 Oct 20121457.3413548.943072.871418.2613171.53113.76
19 Oct 20121433.1913343.513005.621419.6413185.13118.91
22 Oct 20121433.8113345.893016.961420.8713197.53122.87
23 Oct 20121413.1113102.532990.461422.9813220.53127.6
24 Oct 20121408.7513077.342981.701425.113242.43132.15
25 Oct 20121412.9713103.682986.121426.81132613135.93
26 Oct 20121411.9413107.212987.951428.4113277.63139.14