2014-09-19 78 views
1

填充隨機數我具有以下樣本數據通過分組

ID Category Status Seq Start DT End DT 
1 CAT 1 U 1 17-Feb-11 17-Feb-11 
1 CAT 1 I 2 17-Feb-11 17-Feb-11 
1 CAT 1 X 0 17-Feb-11 3-Mar-11 
1 CAT 1 X 0 3-Mar-11 4-Mar-11 
1 CAT 1 X 0 4-Mar-11 28-Jun-11 
1 CAT 1 I 6 28-Jun-11 29-Jun-11 
1 CAT 1 X 0 29-Jun-11 15-Jul-11 
1 CAT 1 X 0 15-Jul-11 28-Jul-11 
1 CAT 1 X 0 28-Jul-11 28-Jul-11 
1 CAT 1 I 10 28-Jul-11 1-Aug-11 
1 CAT 1 D 11 1-Aug-11 8-Aug-11 
1 CAT 1 E 0 8-Aug-11 9-Aug-11 
1 CAT 1 E 0 9-Aug-11 1-Sep-11 
1 CAT 1 E 0 1-Sep-11 13-Sep-11 

預期輸出: -

ID Category Status Seq Start DT End DT 
1 CAT 1 U 1 17-Feb-11 17-Feb-11 
1 CAT 1 I 2 17-Feb-11 17-Feb-11 
1 CAT 1 X 0 17-Feb-11 3-Mar-11 
1 CAT 1 X 0 3-Mar-11 4-Mar-11 
1 CAT 1 X 0 4-Mar-11 28-Jun-11 
1 CAT 1 I 6 28-Jun-11 29-Jun-11 
1 CAT 1 X ***0A*** 29-Jun-11 15-Jul-11 
1 CAT 1 X ***0A*** 15-Jul-11 28-Jul-11 
1 CAT 1 X ***0A*** 28-Jul-11 28-Jul-11 
1 CAT 1 I 10 28-Jul-11 1-Aug-11 
1 CAT 1 D 11 1-Aug-11 8-Aug-11 
1 CAT 1 E 0 8-Aug-11 9-Aug-11 
1 CAT 1 E 0 9-Aug-11 1-Sep-11 
1 CAT 1 E 0 1-Sep-11 13-Sep-11 

是SQL生成的 「SEQ」 列列,它基本上是rownum。對於狀態列中相同的一組值,在這種情況下,「seq」值應保持相同,例如0。但對於下一組相同的狀態值,「seq」值應該與前一個值不同,例如0A。對於所有其他情況,seq值將只是rownum。 謝謝

+2

屏幕截圖沒有描述發生了什麼,也沒有描述應該發生什麼。 – wallyk 2014-09-19 03:54:03

+0

感謝您回覆。我使用SQL(rownum)來生成SEQ列。當「狀態」具有相同的值時,「SEQ」將具有一些不同的值(除了rownum),例如。 0在這種情況下。但是,如果同一組值再次出現「狀態」,那麼「seq」列應該有一些不同的值,例如00.但在我的情況下,我得到0爲每組狀態值。希望這是有道理的。 – Harry 2014-09-19 04:10:29

+2

@哈利,請編輯你的問題,並在那裏添加相關信息。最好提供一些樣本數據和預期的輸出,而不是附上圖片。 – Noel 2014-09-19 04:12:02

回答

2

如果僅爲所有組獲得單獨的值就足夠了,則可以使用SUM() OVER()子句生成組名。在這裏,我假設ORDER BY "Start DT", "End DT", "Seq"足以獲得行的正確排序,所以如果不正確,您可能需要調整。

WITH cte AS (
    SELECT "ID", "Category", "Status", "Seq", "Start DT", "End DT", 
    SUM("Seq") OVER (ORDER BY "Start DT", "End DT", "Seq") "Seq2" 
    FROM mytable 
) 
SELECT "ID", "Category", "Status", 
    CASE WHEN "Seq"=0 
     THEN 'A' || CAST("Seq2" AS VARCHAR(32)) 
     ELSE CAST("Seq" AS VARCHAR(32)) 
     END "Seq", 
    "Start DT", "End DT" 
FROM cte 

因爲我們想組值的值爲0,總和將產生每一行相同的值(因爲當我們添加0總和不變化),所以我們可以用之來生成一個組名。

An SQLfiddle to test with

+0

查詢工作完美,但問題是,如果我有一個像 狀態數據\t \t START_DT \t END_DT \t Ë\t \t 03/FEB/12 \t 08/FEB/12 Ë\t \t 08/FEB/12 \t 13/JUL/12 我\t \t 13/JUL/12 \t 31/JUL/12 我\t \t 31/JUL/12 \t 28/AUG/12 ë\t \t 28/AUG/12 \t 06/SEP/12 ë查詢將不會爲最後兩個「E」狀態生成不同的SEQ。它將分配與前兩個「E」狀態相同的SEQ,因爲對於「I」狀態,SEQ將爲0,並且在這種情況下總和不會改變。 希望這是有道理的。 謝謝 – Harry 2014-09-22 10:29:34

+0

@Harry Hm,你能更新我用這些數據構建的SQLfiddle嗎?在評論格式中解析有點困難。 – 2014-09-22 10:49:57

+0

[示例SQL小提琴](http://sqlfiddle.com/#!4/59ef9/4) 您將看到3,4,5和8,9記錄具有相同的狀態和seq。我的要求是這些組的SEQ不同(一個用於3,4,5和一個用於8,9) – Harry 2014-09-23 03:52:23