日期:2014-05-17  浏览次数:20914 次

求高手帮忙看一条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:返回有序组中一行的偏移量,从而可用于按特定标准排序的行号
------解决方案--------------------
正解啊