【问题标题】:How to return only unique rows from SQL Query that already uses distinct如何从已经使用不同的 SQL 查询中仅返回唯一行
【发布时间】:2020-11-13 02:38:05
【问题描述】:

我知道您只能在特定列上使用 distinct 运算符返回唯一行。我成功地在列上使用 distinct 运算符进行查询。现在,我希望查询只返回剩余列的不同结果。例如下面的查询:

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;

给出下表中显示的结果

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

根据查询的第二列和第三列,只有两个不同的行。如何修改查询以仅返回这两个不同的行?

【问题讨论】:

  • oid 列中的结果是什么?

标签: sql oracle distinct distinct-values


【解决方案1】:

一种方法使用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;

【讨论】:

  • 这给出了以下结果:1.0 S-40S 1 2.0 S-40S 1 1.0 S-40S 1 2.0 S-40S 1 1.0 S-40S 1 2.0 S-40S 1
【解决方案2】:

请使用以下查询。你必须使用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;

【讨论】:

    猜你喜欢
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2016-08-20
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多