2016-07-25 3 views
1

У меня есть таблица, какПодготовить комплексный заказ в записи таблицы. (MS SQL)

ВХОД

PKID FKID IsActive OrderNo 
1  1 1  1 
2  1 0  2 
3  1 0  3 
4  1 0  4 
5  1 1  5 
6  1 0  6 
7  1 0  7 

ВЫВОД

PKID FKID IsActive OrderNo OUTPUTs 
1  1 1  1   1 (first IsActive True) 
2  1 0  2   1 (After isActive true start from 1) 
3  1 0  3   2 
4  1 0  4   3 
5  1 1  5   2 (Second IsActive True) 
6  1 0  6   1 (After isActive true start from 1) 
7  1 0  7   2 

Я попытался с RANK() OVER(PARTITION BY IsActive ORDER BY orderNo) Но не получил такой же выход.

МОЯ Выходная логика

1) найти ранг по IsActive

2) Если IsActive запись найдена, то после этого начала записи с 1

Как я могу получил выход в MS SQL?

Любой другой способ, могу ли я сделать это без ранга?

благодарив,

ответ

2

Вы можете использовать следующий запрос:

SELECT PKID, FKID, IsActive, OrderNo, 
     CASE 
      WHEN IsActive = 1 THEN grp 
      ELSE ROW_NUMBER() OVER (PARTITION BY grp ORDER BY OrderNo) - 1 
     END AS Output 
FROM (
    SELECT PKID, FKID, IsActive, OrderNo, 
     COUNT(CASE WHEN IsActive = 1 THEN 1 END) OVER (ORDER BY OrderNo) AS grp 
    FROM mytable) AS t 

Примечание: Запрос предполагает, что вы используете SQL Server 2012 или более поздней версии.

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