Oracle row_number大于且包括1

时间:2018-03-06 08:55:42

标签: sql oracle oracle11g

我有一个使用row_number函数的查询。我想返回大于1的所有行,但也包括1。 当我尝试

row_number()over(partition by .. order by)rn
...rn > 1

我得到rn = 2,3,4 ......

如果我这样做

rn >= 1

我得到的行只有= 1以及大于1的行。

如何在大于1的行中包含1但不包括仅为1的行?

非常感谢所有帮助

修改

我担心我的问题没有意义。 我正在搜索存储仓库中的项目并尝试查找具有相同项目的所有位置。我的查询是以下

select * from (
   select item_number, bin_number, qty
    ,row_number()over(partition by item order by loc) rn --maybe I need count(*) over(....)
     from my_table
) where rn >= 1

返回

item_number | bin_number | qty | rn
12345       |  A1        | 2   | 1
123456      |  A2        | 1   | 1
123456      |  A3        | 1   | 2
123456      |  A4        | 4   | 3

如果改变

rn > =1

rn > 1

我得到了

item_number | bin_number | qty | rn
123456      |  A3        | 1   | 2
123456      |  A4        | 4   | 3

我希望在rn大于1

时包含所有

2 个答案:

答案 0 :(得分:2)

使用count而不是row_number。

select * from (select count()over(partition by .. order by) cn
                 from ...) x
where x.cn > 1

如果您还想要row_number值,请将其添加为选择列表中的单独列。

select * from (select count()over(partition by .. order by) cn,
                      row_number()over(partition by .. order by) rn
                 from ...) x
where x.cn > 1

更新: 从count()中删除订单。这是一个例子。

create table mytab(id number, name varchar2(100));
insert into mytab values(1,'Ram');
insert into mytab values(1,'Rahim');
insert into mytab values(1,'Reuben');
insert into mytab values(2,'Esther');
insert into mytab values(3,'Veena');
insert into mytab values(3,'Visu');
insert into mytab values(4,'Vishnu');
commit;

select * from mytab;

输出:

ID NAME 
1 Ram 
1 Rahim 
1 Reuben 
2 Esther 
3 Veena 
3 Visu 
4 Vishnu
select * 
  from (select id, 
               name,
               count(1) over(partition by id) cn, 
               row_number() over(partition by id order by name) rn 
          from mytab) x
 where x.cn > 1;

输出:

ID  NAME    CN  RN
1   Rahim   3   1
1   Ram     3   2
1   Reuben  3   3
3   Veena   2   1
3   Visu    2   2

答案 1 :(得分:0)

我使用了HR模式中Employees表的示例。

SELECT
    row_number() over (partition by salary order by salary) as serial_no,
    employee_id,
    first_name,
    salary,
    department_id
FROM
    employees
WHERE
    salary IN (
        SELECT
            salary
        FROM
            employees
        GROUP BY
            salary
        HAVING
            COUNT(salary) > 1

    ) ORDER BY salary;

看看这是否符合您的目的,并提供反馈。