SQL根據分組求連續範圍

壹頁書發表於2014-06-27
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部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1196222/,如需轉載,請註明出處,否則將追究法律責任。

相關文章