如何 return 仅来自 SQL 已经使用不同的查询的唯一行
How to return only unique rows from SQL Query that already uses distinct
我知道您可以 return 在特定列上使用 distinct 运算符只允许唯一的行。我成功地在列上使用了不同的运算符进行查询。现在,我希望查询仅 return 剩余列的不同结果。例如下面的查询:
Select distinct pl.oid, pr.npd, sch.shortstringvalue
from sonpda_rdb.jpipelinesystem pl
join sonpda_rdb.xsystemhierarchy xsys1 on xsys1.oidorigin = pl.oid
join sonpda_rdb.jnameditem it1 on it1.oid = pl.oid
join sonpda_rdb.jrtepiperun pr on pr.oid = xsys1.oiddestination
join sonpda_rdb.jnameditem it2 on it2.oid = pr.oid
join sonpda_rdb.xownsparts xop on xop.oidorigin = pr.oid
join sonpda_rdb.jrtestockpartoccur stckprt on stckprt.oid = xop.oiddestination
join sonpda_rdb.xmadefrom xmf on xmf.oidorigin = stckprt.oid
join sonpda_rdb.jdpipecomponent pipcmp on pipcmp.oid = xmf.oiddestination
join sonpda_rdb.cl_schedulethickness sch on sch.valueid = pipcmp.firstsizeschedule
where it1.itemname = 'C-8001'
order by pr.npd desc;
给出下面table所示的结果
00033457000000000625CE8F235CF10F 2.0 S-40S
000334570000000012BADECCFA5B4804 2.0 S-40S
00033457000000000625CE8F235CF10F 1.0 S-40S
000334570000000012BADECCFA5B4804 1.0 S-40S
000334570000000014BAB9B0FB5B7704 1.0 S-40S
根据查询的第二列和第三列,只有两个不同的行。如何将查询修改为仅 return 这两个不同的行?
一种方法使用 row_number()
:
with q as (
<your query here>
)
select q.*
from (select q.*,
row_number() over (partition by npd, shortstringvalue order by oid desc) as seqnum
from q
) q
where seqnum = 1;
从 Oracle 12C 开始,您还可以使用:
select . . .
from . . .
order by row_number() over (partition by npd, shortstringvalue order by oid desc)
fetch first 1 row with ties;
请使用以下查询。你必须使用 row_number()
.
select
oid, npd, shortstringvalue
from
(Select distinct
pl.oid, pr.npd, sch.shortstringvalue,
row_number() over (partition by pr.npd, sch.shortstringvalue order by sch.shortstringvalue) as rnk
from
sonpda_rdb.jpipelinesystem pl
join
sonpda_rdb.xsystemhierarchy xsys1 on xsys1.oidorigin = pl.oid
join
sonpda_rdb.jnameditem it1 on it1.oid = pl.oid
join
sonpda_rdb.jrtepiperun pr on pr.oid = xsys1.oiddestination
join
sonpda_rdb.jnameditem it2 on it2.oid = pr.oid
join
sonpda_rdb.xownsparts xop on xop.oidorigin = pr.oid
join
sonpda_rdb.jrtestockpartoccur stckprt on stckprt.oid = xop.oiddestination
join
sonpda_rdb.xmadefrom xmf on xmf.oidorigin = stckprt.oid
join
sonpda_rdb.jdpipecomponent pipcmp on pipcmp.oid = xmf.oiddestination
join
sonpda_rdb.cl_schedulethickness sch on sch.valueid = pipcmp.firstsizeschedule
where
it1.itemname = 'C-8001') query
where
rnk = 1
order by
npd desc;
我知道您可以 return 在特定列上使用 distinct 运算符只允许唯一的行。我成功地在列上使用了不同的运算符进行查询。现在,我希望查询仅 return 剩余列的不同结果。例如下面的查询:
Select distinct pl.oid, pr.npd, sch.shortstringvalue
from sonpda_rdb.jpipelinesystem pl
join sonpda_rdb.xsystemhierarchy xsys1 on xsys1.oidorigin = pl.oid
join sonpda_rdb.jnameditem it1 on it1.oid = pl.oid
join sonpda_rdb.jrtepiperun pr on pr.oid = xsys1.oiddestination
join sonpda_rdb.jnameditem it2 on it2.oid = pr.oid
join sonpda_rdb.xownsparts xop on xop.oidorigin = pr.oid
join sonpda_rdb.jrtestockpartoccur stckprt on stckprt.oid = xop.oiddestination
join sonpda_rdb.xmadefrom xmf on xmf.oidorigin = stckprt.oid
join sonpda_rdb.jdpipecomponent pipcmp on pipcmp.oid = xmf.oiddestination
join sonpda_rdb.cl_schedulethickness sch on sch.valueid = pipcmp.firstsizeschedule
where it1.itemname = 'C-8001'
order by pr.npd desc;
给出下面table所示的结果
00033457000000000625CE8F235CF10F 2.0 S-40S
000334570000000012BADECCFA5B4804 2.0 S-40S
00033457000000000625CE8F235CF10F 1.0 S-40S
000334570000000012BADECCFA5B4804 1.0 S-40S
000334570000000014BAB9B0FB5B7704 1.0 S-40S
根据查询的第二列和第三列,只有两个不同的行。如何将查询修改为仅 return 这两个不同的行?
一种方法使用 row_number()
:
with q as (
<your query here>
)
select q.*
from (select q.*,
row_number() over (partition by npd, shortstringvalue order by oid desc) as seqnum
from q
) q
where seqnum = 1;
从 Oracle 12C 开始,您还可以使用:
select . . .
from . . .
order by row_number() over (partition by npd, shortstringvalue order by oid desc)
fetch first 1 row with ties;
请使用以下查询。你必须使用 row_number()
.
select
oid, npd, shortstringvalue
from
(Select distinct
pl.oid, pr.npd, sch.shortstringvalue,
row_number() over (partition by pr.npd, sch.shortstringvalue order by sch.shortstringvalue) as rnk
from
sonpda_rdb.jpipelinesystem pl
join
sonpda_rdb.xsystemhierarchy xsys1 on xsys1.oidorigin = pl.oid
join
sonpda_rdb.jnameditem it1 on it1.oid = pl.oid
join
sonpda_rdb.jrtepiperun pr on pr.oid = xsys1.oiddestination
join
sonpda_rdb.jnameditem it2 on it2.oid = pr.oid
join
sonpda_rdb.xownsparts xop on xop.oidorigin = pr.oid
join
sonpda_rdb.jrtestockpartoccur stckprt on stckprt.oid = xop.oiddestination
join
sonpda_rdb.xmadefrom xmf on xmf.oidorigin = stckprt.oid
join
sonpda_rdb.jdpipecomponent pipcmp on pipcmp.oid = xmf.oiddestination
join
sonpda_rdb.cl_schedulethickness sch on sch.valueid = pipcmp.firstsizeschedule
where
it1.itemname = 'C-8001') query
where
rnk = 1
order by
npd desc;