2017-10-19 94 views
0

希望找到一些東西。根據標誌變量break row_number()序列

我有數據如下所示

ID月標誌 111年1月1 111 02月01日 111 3月1日 111的apr 0 111可以0 111軍1 222年1月1 222 02月01日 222擦傷0 222的apr 0 222可以0 222軍1

我尋找輸出如下

ID月標誌順序 111 01月01日1 111 2月1日2 111 3月1日3 111的apr 0 1 111可以0 2 111軍1 1 222 01月01日1 222 2月1日2 222擦傷0 1 222的apr 0 2 222可以0 3 222軍1 1

我試圖ROW_NUMBER(),但問題是,我們不能打破序列並重新開始。在整體水平,當曾經存在標誌變量從0到1或1變化爲0,我需要從1開始計數的每個ID分別

回答

0

假設SQL Server中,這裏有一個例子:

DECLARE @T table (id int, [month] char(3), flag bit) 

INSERT INTO @T 
VALUES 
(111, 'jan', 1) 
,(111, 'feb', 1) 
,(111, 'mar', 1) 
,(111, 'apr', 0) 
,(111, 'may', 0) 
,(111, 'jun', 1) 
,(222, 'jan', 1) 
,(222, 'feb', 1) 
,(222, 'mar', 0) 
,(222, 'apr', 0) 
,(222, 'may', 0) 
,(222, 'jun', 1) 

SELECT 
    id 
    , [month] 
    , flag 
    , ROW_NUMBER() OVER (PARTITION BY id, section ORDER BY monthNum) [order] 
FROM 
    (
     SELECT 
      id 
      , [month] 
      , monthNum 
      , flag 
      , SUM(CASE WHEN newValue = 1 THEN 1 ELSE 0 END) OVER (PARTITION BY id ORDER BY monthNum) section 
     FROM 
      (
       SELECT 
        id 
        , [month] 
        , monthNum 
        , flag 
        , CASE WHEN LAG(flag, 1, ABS(flag - 1)) OVER (PARTITION BY id ORDER BY monthNum) = flag THEN 0 ELSE 1 END newValue 
       FROM 
        (
         SELECT 
          id 
          , [month] 
          , MONTH(CAST('1 ' + [month] + ' 17' AS datetime)) monthNum 
          , flag 
         FROM @T 
        ) Q 
      ) Q2 
    ) Q3 
+0

我的錯誤我需要在postgresql中做到這一點 –

+0

我可以在postgres中做到這一點。謝謝 –