Oracle
 sql >> база данни >  >> RDS >> Oracle

PARTITION BY с и без KEEP в Oracle

MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) НАД (РАЗДЕЛЕНИЕ ПО deptno) 

Изявлението може да се разглежда в (приблизително) ред отдясно наляво:

  • НАД (РАЗДЕЛЯНЕ ПО deptno) означава разделяне на редовете на отделни групи от deptno; след това
  • ПОРЪЧАЙ ПО sal означава, че за всеки дял подредете редовете по sal (имплицитно с помощта на ASC крайна поръчка); след това
  • ПАЗЕТЕ (ПЪРВО DENSE_RANK означава да се даде (последователно) класиране на подредените редове за всеки дял (редове с идентични стойности за подредените колони ще получат един и същ ранг) и отхвърли всички редове, които не са класирани първи; и накрая
  • MIN(sal) за останалите редове на всеки дял, върнете минималната заплата.

В този случай MIN и DENSE_RANK FIRST и двете работят на sal колона, така че ще направи същото нещо и KEEP (DENSE_RANK FIRST ORDER BY sal) е излишно.

Ако обаче използвате различна колона за минимума, тогава можете да видите ефектите:

SQL Fiddle

Настройка на схемата на Oracle 11g R2 :

СЪЗДАВАНЕ НА ТАБЛИЦА тест (име, sal, deptno) ASSELECT 'a', 1, 1 ОТ DUALUNION ALL SELECT 'b', 1, 1 ОТ DUALUNION ALL SELECT 'c', 1, 1 ОТ DUALUNION ALL SELECT 'd', 2, 1 ОТ DUALUNION ALL SELECT 'e', ​​3, 1 ОТ DUALUNION ALL SELECT 'f', 3, 1 ОТ DUALUNION ALL SELECT 'g', 4, 2 ОТ DUALUNION ALL SELECT 'h', 4, 2 ОТ DUALUNION ВСИЧКИ ИЗБЕРЕТЕ 'i', 5, 2 ОТ DUALUNION ВСИЧКИ ИЗБЕРЕТЕ 'j', 5, 2 ОТ DUAL; 

Запитване 1 :

ИЗБЕРЕТЕ DISTINCT MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) NAVER (PARTITION BY deptno) AS min_sal_first_sal, MAX(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) НАД (PARTITION BY sal_ deptno) AS_ MIN(име) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS min_name_first_sal, MAX(name) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS max_name_first_sal, LASTKEEPRANK ORDER BY sal) OVER (PARTITION BY deptno) AS min_name_last_sal, MAX(name) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) AS max_name_last_sal, deptnoFROM тест 

Резултати :

<предварителен код>| MIN_SAL_FIRST_SAL | MAX_SAL_FIRST_SAL | MIN_NAME_FIRST_SAL | MAX_NAME_FIRST_SAL | MIN_NAME_LAST_SAL | MAX_NAME_LAST_SAL | DEPTNO ||-------------------|-------------------|------- -------------|-------------------|-------------- ----|-------------------|--------|| 1 | 1 | а | в | д | е | 1 || 4 | 4 | g | ч | аз | j | 2 |

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Обяснение на оператора на Oracle INTERSECT

  2. Oracle сравнява времеви печат с дата

  3. Генериране на sql вмъкване в за Oracle

  4. Отмяна на ангажирана транзакция

  5. Защо имената на таблица/колона/индекс на Oracle са ограничени до 30 знака?