1

我有两个表并没有真正关联,但需要合并。所以我在两张桌子上使用 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。但问题在于它不会进行运行计数,它只会显示每行的总计数。

4

1 回答 1

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
于 2013-08-12T18:09:46.740 回答