读书人

求高手帮忙看一条sql语句最好只扫描

发布时间: 2012-04-09 13:41:24 作者: rapoo

求高手帮忙看一条sql语句,最好只扫描表一次,使用分析函数
现在有个表 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

[解决办法]
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
[解决办法]

SQL code
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
[解决办法]
这个。楼上兄弟基本搞定,
我在这里补充一下分析函数吧!

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

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

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

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

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

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

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

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

ROW_NUMBER:返回有序组中一行的偏移量,从而可用于按特定标准排序的行号
[解决办法]
正解啊

读书人网 >oracle

热点推荐