首页 > 解决方案 > 具有分析功能的 oracle 查询以根据条件设置行号

问题描述

你好,我写了一个查询,通过行号获取车辆数据,并进行一些操作。我已经写了一个条件,如果动作等于“IN”,那么在不同列中显示的行号和在不同列中显示的“OUT”行号,按密码分区。但是如果条件满足“OUT”相同的密码,我想重置行号这里是查询http://sqlfiddle.com/#!4/7e0d9/1的小提琴,这里是代码

  SELECT
  agent_id,
  passnumber,





                case
                when action='IN' then
                ROW_NUMBER() OVER(
                    PARTITION BY passnumber
                    ORDER BY
                        passnumber ASC
                ) 
                end AS rn_in,
                case
                when action='OUT' then
                ROW_NUMBER() OVER(
                    PARTITION BY passnumber
                    ORDER BY
                        passnumber ASC
                ) 
                end AS rn_out
            FROM
            vehicle_log

我得到这样的结果

      agent_id   passnumber   rn_in  rn_out
      ========   ==========   =====  ======

      1          1214         1      null
      1          1214         2      null
      1          1214         null   3 

但我应该是这样的

      agent_id   passnumber   rn_in  rn_out
      ========   ==========   =====  ======

      1          1214         1      null
      1          1214         2      null
      1          1214         null   1

你能告诉我我该怎么做吗?

标签: sqloracle

解决方案


您必须将 Action 列添加到您的分区案例。你可以试试这段代码:

SELECT
agent_id,
passnumber,
case when action='IN' then
                    row_number() OVER(
                        PARTITION BY passnumber,action
                        ORDER BY
                            passnumber,action ASC
                    ) 
                    end AS rn_in,   case
                    when action='OUT' then
                    row_number() OVER(
                        PARTITION BY passnumber,action
                        ORDER BY
                            passnumber,action ASC
                    ) 
                    end AS rn_out
                FROM
                vehicle_log

推荐阅读