2013-08-12 9 views
1

У меня есть две таблицы, которые на самом деле не связаны, но их необходимо объединить. Поэтому я использую объединение всех двух таблиц. Объединенные таблицы упорядочены по дате, поэтому строки из одной таблицы распределяются между строками из другой таблицы. Что мне нужно сделать, так это получить счетчик столбцов, чтобы я мог группировать элементы.Инкрементный номер группы на основе значения строки SQL Server 2008

Чтобы пояснить далее, таблица 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 

Так unioned стол после того, как какая-то магия будет выглядеть так:

Таблица 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

Это было бы так, так, так гораздо проще в SQL Server 2012. –

+1

Кроме того, эти ужасные форматы даты. –

+0

На самом деле, в 2012 году я работал отлично, но потом мы обнаружили, что наша производственная база работает в 2008 году, поэтому нам пришлось понизить нашу базу данных разработчиков. Поэтому я слышу тебя. Кроме того, обратите внимание, что эти данные не являются точным представителем фактического формата моих данных. Я упростил это для объяснения проблемы. – Andrew

ответ

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 
+1

Является ли HASH JOIN полезным только потому, что ваша демонстрация использует переменную таблицы без статистики? Я предлагаю, чтобы это не было частью ответа, даже если ваша демонстрация не дает оптимального плана без него или, по крайней мере, объясняет, почему вы указали явный намек на соединение. Они должны быть зарезервированы для очень конкретных сценариев, когда все входы и выходы известны. –

+0

Да. Я забыл этот намек. В этом случае этот намек не является полезным. –

+1

Удивительно, что и сделал. Раньше я еще ничего не делал с CTE, поэтому я только понимаю, что произошло. Однако он должен работать. Так что это то, что мне нужно будет исследовать больше, чтобы понять. Спасибо за помощь. – Andrew

Смежные вопросы