Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak wybrać zakresy w zakresie rekordów w Oracle?

To fajny sposób, wymyślna nazwa „metoda Tabibitosan " przyznane przez Aketi Jyuuzou.

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>

Uwaga Lepiej jest użyć DENSE_RANK aby uniknąć duplikatów.

Tabela

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.

Istnieją duplikaty dla num =1.

Używasz 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>

Używam 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>

Tak więc w przypadku duplikatów ROW_NUMBER zapytanie dałoby nieprawidłowe wyniki. Powinieneś użyć 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. Jak przechwycić zdarzenie „następne”, gdy przesunięcie jest zmienne dla elementów, które można wielokrotnie przetwarzać?

  2. Rozwiązanie Gaps and Islands w Oracle - wykorzystanie rekurencji

  3. Zadanie SQL Agent — połączenie może nie być poprawnie skonfigurowane lub nie masz odpowiednich uprawnień do tego połączenia?

  4. Jak załadować płaski plik z dynamicznymi kolumnami o różnym typie danych do bazy danych Oracle?

  5. Jak zmienić język wyjątków Oracle w .Net/C#?