0

这是我的小提琴

要求:每次Entry Form更改,然后重新编号new_form_line_no

最后一列在Line_number=7New_form_line_no上按预期正确重置。但是,也希望它在第 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
4

1 回答 1

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

于 2013-10-16T21:19:28.653 回答