求高手帮忙看一条sql语句,最好只扫描表一次,使用分析函数

whlizi 2012-03-06 05:19:00
现在有个表 tab 表结构和数据如下:
area NAME TIME
027 aaa 2012-02-01 16:27:52
027 bbb 2012-02-01 16:28:32
027 ccc 2012-02-01 18:36:16
0710 ddd 2012-02-01 19:00:15
0710 bbb 2012-02-01 19:04:09
0710 aaa 2012-02-01 19:23:15

现在要求查出如下结果,最后2列为 按area分组后,最小时间对应的名称和最大时间对应的名称,谁能帮忙看下
area NAME TIME 最小时间对应的名称 最大时间对应的名称
027 aaa 2012-02-01 16:27:52 aaa ccc
027 bbb 2012-02-01 16:28:32 aaa ccc
027 ccc 2012-02-01 18:36:16 aaa ccc
0710 ddd 2012-02-01 19:00:15 ddd aaa
0710 bbb 2012-02-01 19:04:09 ddd aaa
0710 aaa 2012-02-01 19:23:15 ddd aaa
...全文
160 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
whlizi 2012-03-08
  • 打赏
  • 举报
回复
select area ,name, time ,
first_value(name) over(partition by area order by time) name1,
last_value(name) over(partition by area order by time) name2
from tab


为什么我这样 name2不是正确的结果?谁能告诉我
dasha2006 2012-03-07
  • 打赏
  • 举报
回复
正解啊
lxyzxq2008 2012-03-06
  • 打赏
  • 举报
回复
这个。楼上兄弟基本搞定,
我在这里补充一下分析函数吧!

RANK :根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置

DENSE_RANK :根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置

FIRST :从DENSE_RANK返回的集合中取出排在最前面的一个值的行

LAST :从DENSE_RANK返回的集合中取出排在最后面的一个值的行

FIRST_VALUE :返回组中数据窗口的第一个值

LAST_VALUE :返回组中数据窗口的最后一个值。

LAG :可以访问结果集中的其它行而不用进行自连接

LEAD :LEAD与LAG相反,LEAD可以访问组中当前行之后的行

ROW_NUMBER:返回有序组中一行的偏移量,从而可用于按特定标准排序的行号
hudingchen 2012-03-06
  • 打赏
  • 举报
回复

SELECT t.*,
MAX(t.NAME) KEEP(DENSE_RANK FIRST ORDER BY t.TIME) OVER(PARTITION BY t.area) min_name,
MAX(t.NAME) KEEP(DENSE_RANK LAST ORDER BY t.TIME) OVER(PARTITION BY t.area) min_name
FROM t

用first_value也能实现
forgetsam 2012-03-06
  • 打赏
  • 举报
回复
select area ,name, time ,
first_value(name) over(partition by area order by time) name1,
first_value(name) over(partition by area order by time desc) name2
from tab

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧