这是我的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
答案 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