我正在试图弄清楚如何从表列中拉取选择值,但也返回其他结果。例如,说我有下表
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 ..........
谢谢!
答案 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