如何使用row_number()重置正确的row_number?

时间:2013-10-16 20:24:57

标签: sql oracle11g analytics

这是我的Fiddle

要求:每次Entry Form更改,然后重置new_form_line_no

上的编号

最后一列New_form_line_no Line_number = 7 上按预期正确重置。 但是,也希望它重置第3行,因为Entry_form从 PR 更改为 OM

我应该在哪里进行修正以获得以下结果?

20  1   1   R   OM  1
20  2   1   N   PR  1
20  3   2   R   OM  1 --This should reset to 1
20  4   3   A   OM  2
20  5   4   2   OM  3
20  6   5   P   OM  4
20  7   47  S   OL  1
20  8   48  A   OL  2
20  9   49  T   OL  3
20  10  50  2   OL  4
20  11  51  T   OL  5
20  12  52  L   OL  6
20  13  53  S   OL  7
20  14  54  O   OL  8

1 个答案:

答案 0 :(得分:1)

这里的问题是前两个记录可以按任何顺序出现,因为它们在ORDER BY子句中使用的列中都具有相同的值。如果你不介意,或者你有另一种方法来确定哪个应该是第一个(并且你可以改变下面的分析函数中的ORDER BY),你可以尝试以下解决方案:

SELECT
    data.*,
    row_number() OVER (PARTITION BY entry_id, entry_form, same_as_prev_or_next
                        ORDER BY entry_seq) AS new_form_line_no_2
  FROM (
    SELECT
      entry_id,
      row_number() OVER (ORDER BY entry_id, entry_seq) AS line_number,
      entry_seq,
      entry_text,       
      entry_form,       
      CASE
        WHEN lag(entry_form, 1, 0) OVER (PARTITION BY entry_id ORDER BY entry_seq) = entry_form 
             OR lead(entry_form, 1, 0) OVER (PARTITION BY entry_id ORDER BY entry_seq) = entry_form THEN 1
        ELSE 0
      END AS same_as_prev_or_next
    FROM entrants
) data
ORDER BY entry_seq
;

它不会返回您的预期,但这是由于我提到的事实 - 前两行的顺序是不确定的。

SQLFiddle:http://sqlfiddle.com/#!4/abb58/18