Sql 如何使用row_number()重置正确的行号?
这是我的 要求:每次Sql 如何使用row_number()重置正确的行号?,sql,oracle11g,analytics,Sql,Oracle11g,Analytics,这是我的 要求:每次条目表更改,然后在新表单行 最后一列New\u form\u line\u no在line\u number=7上按预期正确重置。 但是,也希望它在第3行重置,因为条目表单从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
条目表
更改,然后在新表单行
最后一列New\u form\u line\u no
在line\u number=7上按预期正确重置。
但是,也希望它在第3行重置,因为条目表单从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
这里的问题是,前两条记录可以按任意顺序出现,因为它们在
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
;
它不会返回您期望的结果,但这是由于我提到的事实——前两行的顺序是不确定的
SQLFIDLE:我明白你的意思。你把我引向了正确的方向。谢谢