Login     Register

        Contact Us     Search

XLeratorDB/windowing Documentation

SQL Server moving COUNT function


MovingCOUNT

Updated: 31 Oct 2012


Use MovingCOUNT to show how many rows are included in an ordered resultant table or within a partition in the resultant table, without having to do a self-join. The count is calculated for each value from the first value in the window to the last value in the window. If the column values are presented to the functions out of order, an error message will be generated.
Syntax
SELECT [Example].[wct].[MovingCOUNT](
  <@Val, sql_variant,>
 ,<@Offset, int,>
 ,<@RowNum, int,>
 ,<@Id, tinyint,>
 ,<@CountNulls, bit,>)
GO
Arguments
@Val
the value passed into the function. @Val is an expression of type float or of a type that can be implicitly converted to float.
@Offset
specifies the window size. @Offset is an expression of type int or of a type that can be implicitly converted to int.
@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 MovingCOUNT calculation. @Id allows you to specify multiple moving sums within a resultant table. @Id is an expression of type tinyint or of a type that can be implicitly converted to tinyint.
@CountNulls
Indicates whether NULL values are included in the count. Enter 'True' to count NULL or 'False' not to count NULL. @CountNulls is an expression of type bit or of a type that can be implicitly converted to bit.
Remarks
·         If @Id is NULL then @Id = 0.
·         To calculate a running count from the first record in a dataset or partition, use the RunningCOUNT function.
·         @RowNum must be in ascending order.
·         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.
Example
In this example we will calculate the running count of items for a check book. We will create a temporary table, #c, populate it with some data and then run the SELECT.
--Create the temporary table
CREATE TABLE #c   (
      trn               int,
      cust_ref    varchar(5),
      date_trn    datetime,
      payee       varchar(20),
      amt_trn           money,
      PRIMARY KEY (trn)
      )
--Populate the table with some data
INSERT INTO #c VALUES (1,'DD','2011-12-23',NULL,1500)
INSERT INTO #c VALUES (2,'1200','2012-01-01','Car Leasing Company',-361.75)
INSERT INTO #c VALUES (3,'1201','2012-01-01','Mortgage Bank',-1129.23)
INSERT INTO #c VALUES (4,'DD','2012-01-08',NULL,1100)
INSERT INTO #c VALUES (5,'1202','2012-01-15','Gas Company',-108.49)
INSERT INTO #c VALUES (6,'1203','2012-01-15','Electric Company',-98.27)
INSERT INTO #c VALUES (7,'1204','2012-01-15','Telephone Company',-136.6)
INSERT INTO #c VALUES (8,'DD','2012-02-15',NULL,1100)
INSERT INTO #c VALUES (9,'1205','2012-02-01','Car Leasing Company',-361.75)
INSERT INTO #c VALUES (10,'1206','2012-02-01','Mortgage Bank',-1129.23)
INSERT INTO #c VALUES (11,'DD','2012-02-08',NULL,1100)
INSERT INTO #c VALUES (12,'1207','2012-02-15','Gas Company',-153.89)
INSERT INTO #c VALUES (13,'1208','2012-02-15','Electric Company',-121.99)
INSERT INTO #c VALUES (14,'1209','2012-02-15','Telephone Company',-138.92)
INSERT INTO #c VALUES (15,'DD','2012-02-23',NULL,1100)
INSERT INTO #c VALUES (16,'1210','2012-03-01','Car Leasing Company',-361.75)
INSERT INTO #c VALUES (17,'1211','2012-03-01','Mortgage Bank',-1129.23)
INSERT INTO #c VALUES (18,'DD','2012-03-08',NULL,1100)
INSERT INTO #c VALUES (19,'1212','2012-03-15','Gas Company',-70.79)
INSERT INTO #c VALUES (20,'1213','2012-03-15','Electric Company',-93.57)
INSERT INTO #c VALUES (21,'1214','2012-03-15','Telephone Company',-149.78)
INSERT INTO #c VALUES (22,'DD','2012-03-23',NULL,1100)
INSERT INTO #c VALUES (23,'1215','2012-04-01','Car Leasing Company',-361.75)
INSERT INTO #c VALUES (24,'1216','2012-04-01','Mortgage Bank',-1129.23)
INSERT INTO #c VALUES (25,'DD','2012-04-08',NULL,1100)
INSERT INTO #c VALUES (26,'1217','2012-04-15','Gas Company',-105.58)
INSERT INTO #c VALUES (27,'1218','2012-04-15','Electric Company',-149.36)
INSERT INTO #c VALUES (28,'1219','2012-04-15','Telephone Company',-145.35)
INSERT INTO #c VALUES (29,'DD','2012-04-23',NULL,1100)
INSERT INTO #c VALUES (30,'1220','2012-05-01','Car Leasing Company',-361.75)
INSERT INTO #c VALUES (31,'1221','2012-05-01','Mortgage Bank',-1129.23)
INSERT INTO #c VALUES (32,'DD','2012-05-08',NULL,1100)
INSERT INTO #c VALUES (33,'1222','2012-05-15','Gas Company',-96.27)
INSERT INTO #c VALUES (34,'1223','2012-05-15','Electric Company',-114.62)
INSERT INTO #c VALUES (35,'1224','2012-05-15','Telephone Company',-145.43)
INSERT INTO #c VALUES (36,'DD','2012-05-23',NULL,1100)
INSERT INTO #c VALUES (37,'1225','2012-06-01','Car Leasing Company',-361.75)
INSERT INTO #c VALUES (38,'1226','2012-06-01','Mortgage Bank',-1129.23)
INSERT INTO #c VALUES (39,'DD','2012-06-08',NULL,1100)
INSERT INTO #c VALUES (40,'1227','2012-06-15','Gas Company',-147.03)
INSERT INTO #c VALUES (41,'1228','2012-06-15','Electric Company',-130.52)
INSERT INTO #c VALUES (42,'1229','2012-06-15','Telephone Company',-147.71)
INSERT INTO #c VALUES (43,'DD','2012-06-23',NULL,1100)
INSERT INTO #c VALUES (44,'1230','2012-07-01','Car Leasing Company',-361.75)
INSERT INTO #c VALUES (45,'1231','2012-07-01','Mortgage Bank',-1129.23)
INSERT INTO #c VALUES (46,'DD','2012-07-08',NULL,1100)
--Calculate the running COUNT
SELECT cast(convert(varchar, date_trn, 106) as char(11)) as date_trn
,cust_ref
,payee
,amt_trn
,wct.MovingCOUNT(payee,5,trn,NULL,'False') as [Moving Count]
FROM #c
--Clean up
DROP TABLE #c
This produces the following result.
date_trn    cust_ref payee                              amt_trn           Moving Count
----------- -------- -------------------- --------------------- ----------------------
23 Dec 2011 DD       NULL                               1500.00                      0
01 Jan 2012 1200     Car Leasing Company                -361.75                      1
01 Jan 2012 1201     Mortgage Bank                     -1129.23                      2
08 Jan 2012 DD       NULL                               1100.00                      2
15 Jan 2012 1202     Gas Company                        -108.49                      3
15 Jan 2012 1203     Electric Company                    -98.27                      4
15 Jan 2012 1204     Telephone Company                  -136.60                      5
15 Feb 2012 DD       NULL                               1100.00                      4
01 Feb 2012 1205     Car Leasing Company                -361.75                      4
01 Feb 2012 1206     Mortgage Bank                     -1129.23                      5
08 Feb 2012 DD       NULL                               1100.00                      4
15 Feb 2012 1207     Gas Company                        -153.89                      4
15 Feb 2012 1208     Electric Company                   -121.99                      4
15 Feb 2012 1209     Telephone Company                  -138.92                      5
23 Feb 2012 DD       NULL                               1100.00                      4
01 Mar 2012 1210     Car Leasing Company                -361.75                      4
01 Mar 2012 1211     Mortgage Bank                     -1129.23                      5
08 Mar 2012 DD       NULL                               1100.00                      4
15 Mar 2012 1212     Gas Company                         -70.79                      4
15 Mar 2012 1213     Electric Company                    -93.57                      4
15 Mar 2012 1214     Telephone Company                  -149.78                      5
23 Mar 2012 DD       NULL                               1100.00                      4
01 Apr 2012 1215     Car Leasing Company                -361.75                      4
01 Apr 2012 1216     Mortgage Bank                     -1129.23                      5
08 Apr 2012 DD       NULL                               1100.00                      4
15 Apr 2012 1217     Gas Company                        -105.58                      4
15 Apr 2012 1218     Electric Company                   -149.36                      4
15 Apr 2012 1219     Telephone Company                  -145.35                      5
23 Apr 2012 DD       NULL                               1100.00                      4
01 May 2012 1220     Car Leasing Company                -361.75                      4
01 May 2012 1221     Mortgage Bank                     -1129.23                      5
08 May 2012 DD       NULL                               1100.00                      4
15 May 2012 1222     Gas Company                         -96.27                      4
15 May 2012 1223     Electric Company                   -114.62                      4
15 May 2012 1224     Telephone Company                  -145.43                      5
23 May 2012 DD       NULL                               1100.00                      4
01 Jun 2012 1225     Car Leasing Company                -361.75                      4
01 Jun 2012 1226     Mortgage Bank                     -1129.23                      5
08 Jun 2012 DD       NULL                               1100.00                      4
15 Jun 2012 1227     Gas Company                        -147.03                      4
15 Jun 2012 1228     Electric Company                   -130.52                      4
15 Jun 2012 1229     Telephone Company                  -147.71                      5
23 Jun 2012 DD       NULL                               1100.00                      4
01 Jul 2012 1230     Car Leasing Company                -361.75                      4
01 Jul 2012 1231     Mortgage Bank                     -1129.23                      5
08 Jul 2012 DD       NULL                               1100.00                      4
In this example, we calculate the running count and the running count for each month and use the ROW_NUMBER() function to determine the @RowNum value passed into the MovingCOUNT function.
SELECT CAST(date_trn as date) as date_trn
,cust_ref
,payee
,amt_trn
,wct.MovingCOUNT(payee,5,ROW_NUMBER() OVER (PARTITION by MONTH(date_trn) ORDER BY trn),1,'False') as [MTD Count]
,wct.MovingCOUNT(amt_trn,5,trn,NULL,'False') as [Moving Ct]
FROM #c
ORDER BY trn
This produces the following result.
date_trn   cust_ref payee                amt_trn   MTD Count Moving Ct
---------- -------- -------------------- --------- --------- ---------
2011-12-23 DD       NULL                   1500.00         0         1
2012-01-01 1200     Car Leasing Company    -361.75         1         2
2012-01-01 1201     Mortgage Bank         -1129.23         2         3
2012-01-08 DD       NULL                   1100.00         2         4
2012-01-15 1202     Gas Company            -108.49         3         5
2012-01-15 1203     Electric Company        -98.27         4         6
2012-01-15 1204     Telephone Company      -136.60         5         6
2012-02-15 DD       NULL                   1100.00         0         6
2012-02-01 1205     Car Leasing Company    -361.75         1         6
2012-02-01 1206     Mortgage Bank         -1129.23         2         6
2012-02-08 DD       NULL                   1100.00         2         6
2012-02-15 1207     Gas Company            -153.89         3         6
2012-02-15 1208     Electric Company       -121.99         4         6
2012-02-15 1209     Telephone Company      -138.92         5         6
2012-02-23 DD       NULL                   1100.00         4         6
2012-03-01 1210     Car Leasing Company    -361.75         1         6
2012-03-01 1211     Mortgage Bank         -1129.23         2         6
2012-03-08 DD       NULL                   1100.00         2         6
2012-03-15 1212     Gas Company             -70.79         3         6
2012-03-15 1213     Electric Company        -93.57         4         6
2012-03-15 1214     Telephone Company      -149.78         5         6
2012-03-23 DD       NULL                   1100.00         4         6
2012-04-01 1215     Car Leasing Company    -361.75         1         6
2012-04-01 1216     Mortgage Bank         -1129.23         2         6
2012-04-08 DD       NULL                   1100.00         2         6
2012-04-15 1217     Gas Company            -105.58         3         6
2012-04-15 1218     Electric Company       -149.36         4         6
2012-04-15 1219     Telephone Company      -145.35         5         6
2012-04-23 DD       NULL                   1100.00         4         6
2012-05-01 1220     Car Leasing Company    -361.75         1         6
2012-05-01 1221     Mortgage Bank         -1129.23         2         6
2012-05-08 DD       NULL                   1100.00         2         6
2012-05-15 1222     Gas Company             -96.27         3         6
2012-05-15 1223     Electric Company       -114.62         4         6
2012-05-15 1224     Telephone Company      -145.43         5         6
2012-05-23 DD       NULL                   1100.00         4         6
2012-06-01 1225     Car Leasing Company    -361.75         1         6
2012-06-01 1226     Mortgage Bank         -1129.23         2         6
2012-06-08 DD       NULL                   1100.00         2         6
2012-06-15 1227     Gas Company            -147.03         3         6
2012-06-15 1228     Electric Company       -130.52         4         6
2012-06-15 1229     Telephone Company      -147.71         5         6
2012-06-23 DD       NULL                   1100.00         4         6
2012-07-01 1230     Car Leasing Company    -361.75         1         6
2012-07-01 1231     Mortgage Bank         -1129.23         2         6
2012-07-08 DD       NULL                   1100.00         2         6
 
In this Example we use a CASE statement and set @CountNulls to 'False' in order to count just the debits.
SELECT cast(convert(varchar, date_trn, 106) as char(11)) as date_trn
,cust_ref
,payee
,amt_trn
,wct.RunningCOUNT(CASE WHEN amt_trn > 0 THEN NULL ELSE amt_trn END,ROW_NUMBER() OVER (PARTITION by MONTH(date_trn) ORDER BY trn),1,'False') as [MTD Count]
,wct.RunningCOUNT(CASE WHEN amt_trn > 0 THEN NULL ELSE amt_trn END,trn,NULL,'False') as [Running Count]
FROM #c
ORDER BY trn
This produces the following result.
date_trn    cust_ref payee                              amt_trn   MTD Count Running Count
----------- -------- -------------------- --------------------- ----------- -------------
23 Dec 2011 DD       NULL                               1500.00           0             0
01 Jan 2012 1200     Car Leasing Company                -361.75           1             1
01 Jan 2012 1201     Mortgage Bank                     -1129.23           2             2
08 Jan 2012 DD       NULL                               1100.00           2             2
15 Jan 2012 1202     Gas Company                        -108.49           3             3
15 Jan 2012 1203     Electric Company                    -98.27           4             4
15 Jan 2012 1204     Telephone Company                  -136.60           5             5
15 Feb 2012 DD       NULL                               1100.00           0             5
01 Feb 2012 1205     Car Leasing Company                -361.75           1             6
01 Feb 2012 1206     Mortgage Bank                     -1129.23           2             7
08 Feb 2012 DD       NULL                               1100.00           2             7
15 Feb 2012 1207     Gas Company                        -153.89           3             8
15 Feb 2012 1208     Electric Company                   -121.99           4             9
15 Feb 2012 1209     Telephone Company                  -138.92           5            10
23 Feb 2012 DD       NULL                               1100.00           5            10
01 Mar 2012 1210     Car Leasing Company                -361.75           1            11
01 Mar 2012 1211     Mortgage Bank                     -1129.23           2            12
08 Mar 2012 DD       NULL                               1100.00           2            12
15 Mar 2012 1212     Gas Company                         -70.79           3            13
15 Mar 2012 1213     Electric Company                    -93.57           4            14
15 Mar 2012 1214     Telephone Company                  -149.78           5            15
23 Mar 2012 DD       NULL                               1100.00           5            15
01 Apr 2012 1215     Car Leasing Company                -361.75           1            16
01 Apr 2012 1216     Mortgage Bank                     -1129.23           2            17
08 Apr 2012 DD       NULL                               1100.00           2            17
15 Apr 2012 1217     Gas Company                        -105.58           3            18
15 Apr 2012 1218     Electric Company                   -149.36           4            19
15 Apr 2012 1219     Telephone Company                  -145.35           5            20
23 Apr 2012 DD       NULL                               1100.00           5            20
01 May 2012 1220     Car Leasing Company                -361.75           1            21
01 May 2012 1221     Mortgage Bank                     -1129.23           2            22
08 May 2012 DD       NULL                               1100.00           2            22
15 May 2012 1222     Gas Company                         -96.27           3            23
15 May 2012 1223     Electric Company                   -114.62           4            24
15 May 2012 1224     Telephone Company                  -145.43           5            25
23 May 2012 DD       NULL                               1100.00           5            25
01 Jun 2012 1225     Car Leasing Company                -361.75           1            26
01 Jun 2012 1226     Mortgage Bank                     -1129.23           2            27
08 Jun 2012 DD       NULL                               1100.00           2            27
15 Jun 2012 1227     Gas Company                        -147.03           3            28
15 Jun 2012 1228     Electric Company                   -130.52           4            29
15 Jun 2012 1229     Telephone Company                  -147.71           5            30
23 Jun 2012 DD       NULL                               1100.00           5            30
01 Jul 2012 1230     Car Leasing Company                -361.75           1            31
01 Jul 2012 1231     Mortgage Bank                     -1129.23           2            32
08 Jul 2012 DD       NULL                               1100.00           2            32
 


Copyright 2008-2024 Westclintech LLC         Privacy Policy        Terms of Service