Oracle - 来自单个列的唯一值,但返回其他列

时间:2011-02-03 20:10:28

标签: sql oracle group-by distinct

我正在试图弄清楚如何从表列中拉取选择值,但也返回其他结果。例如,说我有下表

person  ..........
------------------
bob     ..........
mary    ..........
bob     ..........
sue     ..........

我想要返回的是

bob     ..........
mary    ..........
sue     ..........

在这种情况下,我不在乎我实际上从其他专栏接收到什么价值,我该怎么做?


跟进问题,如果我关心怎么办?如果我有这张桌子怎么办

person  type    color   ..........
----------------------------------
bob     0       blue    ..........
mary    1       green   ..........
bob     1       red     ..........
sue     0       yellow  ..........

而这一次我又想要独一无二的人,但是当他的类型为0时我希望结果回到bob,所以对他来说我会看到

bob     0   blue    ..........
mary    1   green   ..........
sue     0   yellow  ..........

谢谢!

2 个答案:

答案 0 :(得分:8)

您可以像RANK一样使用analytic functions来描述要保留哪一行的算法,然后执行类似

的操作
SELECT *
  FROM (SELECT person,
               type,
               color,
               RANK() OVER( PARTITION BY person
                                ORDER BY type asc ) rnk
          FROM <<person_table>>)
 WHERE rnk = 1

这将返回每个人的“第一”行,其中“first”由具有最低TYPE值的行确定。

当你开始查看排名行时要注意的一件事是,有三种不同的分析函数--RANK,DENSE_RANK和ROW_NUMBER--它们基本上都做同样的事情但处理不同的关系。 RANK是标准的田径排名功能 - 如果有两行排在第一位(即两行PERSON ='bob'和TYPE = 0),他们两者得到排名为1而下一行的排名为3,所以没有“第二位”排。在相同的情况下,DENSE_RANK也会给两个绑定的行排名为1但是会给下一行排名2.ROW_NUMBER会随意给一个绑定的行排名为1,给另一个排名为2,并给第三行排名3.当然,您可以通过向ORDER BY子句添加其他列来打破关系。

答案 1 :(得分:1)

对于没有RANK的DB使用通用SQL的替代语法

SELECT
       person,
       type,
       color

FROM 

   <<person_table>> p 
   inner join 
  (SELECT person, 
         min(type) type              
    FROM <<person_table>>
    GROUP BY 
         person) minType
    on p.Person = minType.Person
       and p.type = minType.type