2013-11-15 14 views
0

我有這個 SQL FiddleOracle-邏輯上給每個組行的基礎上的值一組來自有序列表

當由sequence_number字段排序,這些記錄需要進行分組,並給出了基於以下一個ROW_NUMBER邏輯: 以下行類型不是0的所有記錄是同一組的一部分。

實施例,從所提供的SQL撥弄,

序列號0,1和2是相同基團的一部分,和序列號3和4是另一基團的一部分。基本上,任何直到0行類型的行都是單個組的一部分。我試圖返回的數據看起來就像是:

GROUP LINE_TYPE SEQUENCE_NUMBER PRODUCT 
------------------------------------------------ 
1  0   0     REM322 
1  6   1     Discount 
1  7   2     Loyalty Discount 
2  0   3     RGM32 
2  6   4     Discount 

另一種方式重新字我是誰後,當通過序列號排序,組號將改變當它擊中是一個0

我一直在想我的大腦想要如何使用分區/滯後甚至自我加入來做到這一點,但我有麻煩。

任何幫助表示讚賞。

回答

1

如果line_type爲0,則將列值設置爲1,然後計算運行總和(使用SUM作爲分析函數)。

select sum(case when line_type = 0 then 1 
       else 0 end 
     ) over (order by sequence_number) as grp, 
     line_type, 
     sequence_number, 
     product 
from ret_trand 
order by sequence_number; 

Demo

+0

你的先生是個天才。非常感謝 – Lock

0

做分組的另一種方法是使用層次查詢和CONNECT_BY_ROOT

SELECT CONNECT_BY_ROOT sequence_number AS first_in_sequence, 
     line_type, 
     sequence_number, 
     product 
FROM ret_trand 
START WITH 
     line_type = 0 
CONNECT BY 
     ( sequence_number - 1 = PRIOR sequence_number 
     AND line_type <> 0) 
ORDER SIBLINGS BY 
     sequence_number; 

SQLFIDDLE

這將通過該組的初始序列號識別組。

如果你想改變這爲組順序排名,那麼你可以使用DENSE_RANK做到這一點:

WITH first_in_sequences AS 
(
    SELECT CONNECT_BY_ROOT sequence_number AS first_in_sequence, 
     line_type, 
     sequence_number, 
     product 
    FROM ret_trand 
    START WITH 
     line_type = 0 
    CONNECT BY 
     ( sequence_number - 1 = PRIOR sequence_number 
      AND line_type <> 0) 
    ORDER SIBLINGS BY 
     sequence_number 
) 
SELECT DENSE_RANK() OVER (ORDER BY first_in_sequence) AS "group", 
     line_type, 
     sequence_number, 
     product 
FROM first_in_sequences; 

SQLFIDDLE

+0

謝謝。任何想法會更有效率?第一個解決方案工作正常,雖然性能是可怕的,因爲它必須對結果進行排序,但我想任何解決方案都必須這樣做。我會嘗試兩種方法,看看哪個效果最好。 – Lock

+0

我已經實現了這個方法,它工作的很棒。雖然性能很糟糕:(而且它使用了所有可用的索引。 – Lock

相關問題