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:

我明白你的意思。你把我引向了正确的方向。谢谢