2016-07-25 21 views
1

我有表像準備複雜的整理成表記錄。(MS SQL)

INPUT

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)如果從1

該記錄開始我怎麼能在MS SQL得到輸出後,發現isActive記錄然後通過isActive

2)發現的等級?

任何其他方式,我可以做到沒有等級?

感謝,

回答

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或更高版本。