hudingchen 发表于 2013-1-26 12:40:11

Oracle中range的使用

-- 需求:求出下表的一个小时内id个数的最大值和最小值。SQL> WITH t AS (2SELECT 1 "id",TO_DATE('2011-04-27 14:05:12','yyyy-mm-dd hh24:mi:ss') c_time FROM DUAL UNION ALL3SELECT 2,TO_DATE('2011-04-27 15:10:42','yyyy-mm-dd hh24:mi:ss') FROM DUAL UNION ALL4SELECT 3,TO_DATE('2011-04-27 15:20:52','yyyy-mm-dd hh24:mi:ss') FROM DUAL UNION ALL5SELECT 4,TO_DATE('2011-06-27 15:12:12','yyyy-mm-dd hh24:mi:ss') FROM DUAL UNION ALL6SELECT 5,TO_DATE('2011-06-27 15:25:52','yyyy-mm-dd hh24:mi:ss') FROM DUAL UNION ALL7SELECT 6,TO_DATE('2011-06-27 15:32:12','yyyy-mm-dd hh24:mi:ss') FROM DUAL UNION ALL8SELECT 7,TO_DATE('2011-06-28 15:25:42','yyyy-mm-dd hh24:mi:ss') FROM DUAL UNION ALL9SELECT 8,TO_DATE('2011-07-11 15:25:42','yyyy-mm-dd hh24:mi:ss') FROM DUAL UNION ALL 10SELECT 9,TO_DATE('2011-07-11 15:25:42','yyyy-mm-dd hh24:mi:ss') FROM DUAL UNION ALL 11SELECT 10,TO_DATE('2011-07-22 15:25:42','yyyy-mm-dd hh24:mi:ss') FROM DUAL UNION ALL 12SELECT 11,TO_DATE('2011-07-23 15:25:42','yyyy-mm-dd hh24:mi:ss') FROM DUAL 13) 14SELECT "id",TO_CHAR(c_time,'yyyy-mm-dd hh24:mi:ss') FROM t ORDER BY 2;      id TO_CHAR(C_TIME,'YYYY-MM-DDHH24:MI:SS')---------- --------------------------------------         1 2011-04-27 14:05:12         2 2011-04-27 15:10:42         3 2011-04-27 15:20:52         4 2011-06-27 15:12:12         5 2011-06-27 15:25:52         6 2011-06-27 15:32:12         7 2011-06-28 15:25:42         8 2011-07-11 15:25:42         9 2011-07-11 15:25:42      10 2011-07-22 15:25:42      11 2011-07-23 15:25:42-- 使用分析函数,rangeSELECT t."id",       TO_CHAR(c_time, 'yyyy-mm-dd hh24:mi:ss'),       COUNT(*) OVER(ORDER BY c_time RANGE BETWEEN CURRENT ROW AND INTERVAL '1' hour following) cntFROM t;-- 其中range表示范围,between...and 表示之前的范围和之后的范围-- CURRENT ROW表示当前行,INTERVAL '1'表示一个小时-- 结果如下:      id C_TIME                                        CNT---------- -------------------------------------- ----------         1 2011-04-27 14:05:12                           1         2 2011-04-27 15:10:42                           2         3 2011-04-27 15:20:52                           1         4 2011-06-27 15:12:12                           3         5 2011-06-27 15:25:52                           2         6 2011-06-27 15:32:12                           1         7 2011-06-28 15:25:42                           1         8 2011-07-11 15:25:42                           2         9 2011-07-11 15:25:42                           2      10 2011-07-22 15:25:42                           1      11 2011-07-23 15:25:42                           1-- 最终的sql:SELECT MIN(cnt) min_hour,       MAX(cnt) max_hourFROM (SELECT COUNT(*) over(ORDER BY c_time RANGE BETWEEN CURRENT ROW AND INTERVAL '1' hour following) cnt          FROM t)-- 结果:MIN_HOUR   MAX_HOUR---------- ----------         1          3
页: [1]
查看完整版本: Oracle中range的使用