ITPub博客

首页 > 数据库 > Oracle > SQL根据分组求连续范围

SQL根据分组求连续范围

Oracle 作者:壹頁書 时间:2014-06-27 15:32:13 1 删除 编辑
http://www.itpub.net/thread-1873736-1-1.html


  1. create table test (id int,name varchar(10));
  2. insert into test values(11,'aaa');
  3. insert into test values(12,'aaa');
  4. insert into test values(13,'aaa');
  5. insert into test values(15,'aaa');
  6. insert into test values(16,'bbb');
  7. insert into test values(17,'bbb');
  8. insert into test values(18,'ccc');
  9. insert into test values(19,'zzz');
  10. insert into test values(20,'zzz');
Oracle:
  1. SELECT name, decode(COUNT(*), 1, to_char(MIN(id)), MIN(id) || '-' || MAX(id)) AS b
  2. FROM (
  3.     SELECT id, name, MAX(rn) OVER (PARTITION BY name ORDER BY id) AS rn
  4.     FROM (
  5.         SELECT id, name, decode(id - LAG(id) OVER (PARTITION BY name ORDER BY id), 1, 0, id) AS rn
  6.         FROM test
  7.     )
  8. )
  9. GROUP BY name, rn
  10. ORDER BY name, rn;

  1. SELECT NAME, decode(COUNT(*), 1, to_char(MIN(id)), MIN(id) || '-' || MAX(id)) AS b
  2. FROM (
  3.     SELECT t.*, id - ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY ID) AS gp
  4.     FROM TEST t
  5. )
  6. GROUP BY NAME, gp
  7. ORDER BY NAME;

MySQL
  1. SELECT name, CASE WHEN COUNT(*) = 1 THEN MIN(id) ELSE concat(MIN(id), '-', MAX(id)) END AS r
  2. FROM (SELECT id, name, id - (
  3.             SELECT COUNT(*)
  4.             FROM test t1
  5.             WHERE t1.name = t2.name
  6.                 AND t1.id <= t2.id
  7.             ) AS rn
  8.     FROM test t2
  9.     ORDER BY name, id
  10.     ) t1
  11. GROUP BY name, rn
  12. ORDER BY name;
用相关子查询实现Oracle row_number分析函数的功能,其余一样。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1196222/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: TPCC-MySQL基准测试
请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6340719