dsc*_*scl 2 sql oracle group-by distinct
我试图弄清楚如何从表列中拉取选择值,但也返回其他结果.例如,说我有下表
person ..........
------------------
bob ..........
mary ..........
bob ..........
sue ..........
Run Code Online (Sandbox Code Playgroud)
我想要回来的是
bob ..........
mary ..........
sue ..........
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我不关心我实际上从其他列中接收bob的值,我该怎么做?
跟进问题,如果我关心怎么办?如果我有这张桌子怎么办?
person type color ..........
----------------------------------
bob 0 blue ..........
mary 1 green ..........
bob 1 red ..........
sue 0 yellow ..........
Run Code Online (Sandbox Code Playgroud)
而这一次我又想要独一无二的人,但是当他的类型为0时我希望结果回到bob,所以对他来说我会看到
bob 0 blue ..........
mary 1 green ..........
sue 0 yellow ..........
Run Code Online (Sandbox Code Playgroud)
谢谢!
您可以使用像RANK这样的分析函数来描述要保留哪一行的算法,然后执行类似的操作
SELECT *
FROM (SELECT person,
type,
color,
RANK() OVER( PARTITION BY person
ORDER BY type asc ) rnk
FROM <<person_table>>)
WHERE rnk = 1
Run Code Online (Sandbox Code Playgroud)
这将返回每个人的"第一"行,其中"first"由具有最低TYPE值的行确定.
当你开始查看排名行时要注意的一件事是,有三种不同的分析函数--RANK,DENSE_RANK和ROW_NUMBER--它们基本上都做同样的事情但处理不同的关系.RANK是标准的田径排名function--如果有并列第一的两行(即两排,其中PERSON ="鲍勃"和TYPE = 0),他们将都得到的秩为1,而下一行会得到一个排名为3所以没有"第二名"排.在相同的情况下,DENSE_RANK也会给两个绑定的行排名为1,但会给下一行排名2.ROW_NUMBER会任意给一个绑定的行排名为1,给另一个排名为2,并给第三行排名3.当然,您可以通过向ORDER BY子句添加其他列来打破关联.