2014-09-19 80 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