我有一个使用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
时包含所有行答案 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;
看看这是否符合您的目的,并提供反馈。