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