Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách chọn phạm vi trong một phạm vi bản ghi trong oracle

Đây là một cách hay, cái tên lạ mắt " phương pháp Tabibitosan "do Aketi Jyuuzou đưa ra.

SQL> WITH data AS
  2    (SELECT num - DENSE_RANK() OVER(PARTITION BY status ORDER BY num) grp,
  3      status,
  4      num
  5    FROM t
  6    )
  7  SELECT MIN(num)
  8    ||' - '
  9    || MAX(num) range,
 10    COUNT(*) cnt
 11  FROM data
 12  WHERE status='A'
 13  GROUP BY grp
 14  ORDER BY grp
 15  /

RANGE         CNT
------ ----------
1 - 3           3
6 - 6           1
9 - 10          2

SQL>

Lưu ý Tốt hơn là sử dụng DENSE_RANK để tránh trùng lặp.

Bảng

SQL> SELECT * FROM t ORDER BY num;

       NUM S
---------- -
         1 A
         1 A
         2 A
         2 A
         3 A
         4 U
         5 U
         6 A
         7 U
         8 U
         9 A

       NUM S
---------- -
        10 A

12 rows selected.

Có các bản sao cho num =1.

Sử dụng DENSE_RANK :

SQL> WITH data AS
  2    (SELECT num - DENSE_RANK() OVER(PARTITION BY status ORDER BY num) grp,
  3      status,
  4      num
  5    FROM t
  6    )
  7  SELECT MIN(num)
  8    ||' - '
  9    || MAX(num) range,
 10    COUNT(*) cnt
 11  FROM data
 12  WHERE status='A'
 13  GROUP BY grp
 14  ORDER BY grp
 15  /

RANGE         CNT
------ ----------
1 - 3           5
6 - 6           1
9 - 10          2

SQL>

Sử dụng ROW_NUMBER :

SQL> WITH DATA AS
  2    (SELECT num - ROW_NUMBER() OVER(PARTITION BY status ORDER BY num) grp,
  3      status,
  4      num
  5    FROM t
  6    )
  7  SELECT MIN(num)
  8    ||' - '
  9    || MAX(num) range,
 10    COUNT(*) cnt
 11  FROM data
 12  WHERE status='A'
 13  GROUP BY grp
 14  ORDER BY grp
 15  /

RANGE         CNT
------ ----------
2 - 3           2
1 - 2           2
1 - 6           2
9 - 10          2

SQL>

Vì vậy, trong trường hợp trùng lặp, ROW_NUMBER truy vấn sẽ cho kết quả không chính xác. Bạn nên sử dụng DENSE_RANK .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi có thể sử dụng đa luồng với Perl's DBI và Oracle không?

  2. Làm cách nào để tăng tốc độ row_number trong Oracle?

  3. SQL để bỏ qua các hàng có thuộc tính cụ thể từ một bảng đã nối

  4. Tại sao các hàm tổng hợp không được phép trong mệnh đề where

  5. Ngăn chặn SQL Injection với truy vấn SQL ALTER USER động