根据行值SQL Server 2008增加组编号

时间:2013-08-12 17:18:51

标签: sql-server-2008 count group-by sql-order-by partition

我有两个表没有真正关联,但需要合并。所以我在两个表上都使用了union all。联合表按日期排序,因此一个表中的行分散在另一个表的行中。我需要做的是获取列的运行计数,以便我可以对元素进行分组。

为了进一步说明,表A保存容器清空的日期,而表B保存容器内容的每日条目。我需要联合两个表,所以我有一个表,我可以在容器清空之前获取容器的信息总和。

所以我需要这样的东西:

表A

Location_ID     Empty Date
123             3/2/13
123             3/10/13
123             4/1/13

表B

PSI             Entry Date      Location_ID
120             2/28/13         123 (same for all)
130             3/1/13 
100             3/8/13
110             3/9/13
200             3/18/13
180             3/20/13

所以在一些魔术之后的联合表看起来像:

表C ......

Location_ID     Date        PSI      Emptied   
123             2/28/13     120      0
123             3/1/13      130      0
123             3/2/13      null     1
123             3/8/13      100      0
123             3/9/13      110      0
123             3/10/13     null     1
123             3/18/13     200      0
123             3/20/13     180      0
123             4/1/13      null     1

我需要做的是分组,以便我可以拥有这样的表

表C_b

Location_ID     Date        PSI      Emptied   Group
123             2/28/13     120      0         1
123             3/1/13      130      0         1
123             3/2/13      null     1         1
123             3/8/13      100      0         2
123             3/9/13      110      0         2
123             3/10/13     null     1         2
123             3/18/13     200      0         3
123             3/20/13     180      0         3
123             4/1/13      null     1         3

我怎样才能以这种方式进行分组?我必须在SQL Server 2008中使用它。我尝试使用Count,Rank和Row_Number。但问题是它不会进行运行计数,只会说每行的总计数。

1 个答案:

答案 0 :(得分:1)

尝试此查询:

DECLARE @MyTable TABLE(
EntryDate DATE NOT NULL,
Emptied BIT NOT NULL
);
INSERT INTO @MyTable (EntryDate,Emptied)
VALUES 
('2013-01-01',0),
('2013-01-02',0),
('2013-01-03',1),
('2013-01-04',0),
('2013-01-05',0),
('2013-01-06',1),
('2013-01-07',0),
('2013-01-08',0),
('2013-01-09',1);

DECLARE @TableWithRowNum TABLE(
EntryDate DATE NOT NULL,
Emptied BIT NOT NULL,
RowNum INT PRIMARY KEY
);
INSERT INTO @TableWithRowNum (EntryDate,Emptied,RowNum)
SELECT  crt.*,ROW_NUMBER() OVER(ORDER BY crt.EntryDate) AS RowNum
FROM    @MyTable crt;

WITH RecCTE
AS(
    SELECT  
        crt.EntryDate,
        crt.Emptied,
        crt.RowNum,
        1 AS Grp
    FROM    @TableWithRowNum crt
    WHERE   crt.RowNum=1
    UNION ALL
    SELECT  
        crt.EntryDate,
        crt.Emptied,
        crt.RowNum,
        CASE WHEN prev.Emptied=1 THEN prev.Grp+1 ELSE prev.Grp END
    FROM    @TableWithRowNum crt INNER JOIN RecCTE prev ON crt.RowNum=prev.RowNum+1
)
SELECT * FROM RecCTE 
OPTION(MAXRECURSION 0); -- Default value for MAXRECURSION is 100
GO

结果:

EntryDate  Emptied RowNum Grp
---------- ------- ------ ---
2013-01-01 0       1      1
2013-01-02 0       2      1
2013-01-03 1       3      1
2013-01-04 0       4      2
2013-01-05 0       5      2
2013-01-06 1       6      2
2013-01-07 0       7      3
2013-01-08 0       8      3
2013-01-09 1       9      3