sql >> Databasteknik >  >> RDS >> Oracle

PARTITION BY med och utan KEEP i Oracle

MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno)

Påståendet kan betraktas i (ungefär) höger-till-vänster-ordning:

  • OVER (PARTITION BY deptno) betyder att dela upp raderna i distinkta grupper av deptno; sedan
  • ORDER BY sal betyder, för varje partition, ordna raderna efter sal (underförstått använder ASC slutordning); sedan
  • KEEP (DENSE_RANK FIRST innebär att ge en (konsekutiv) rankning till de ordnade raderna för varje partition (rader med identiska värden för ordningskolumnerna kommer att ges samma rang) och kassera alla rader som inte rankas först; och slutligen
  • MIN(sal) för de återstående raderna i varje partition, returnera minimilönen.

I det här fallet MIN och DENSE_RANK FIRST fungerar båda på sal kolumnen så kommer att göra samma sak och KEEP (DENSE_RANK FIRST ORDER BY sal) är överflödig.

Men om du använder en annan kolumn för minimum kan du se effekterna:

SQL Fiddle

Oracle 11g R2 Schema Setup :

CREATE TABLE test (name, sal, deptno) AS
SELECT 'a', 1, 1 FROM DUAL
UNION ALL SELECT 'b', 1, 1 FROM DUAL
UNION ALL SELECT 'c', 1, 1 FROM DUAL
UNION ALL SELECT 'd', 2, 1 FROM DUAL
UNION ALL SELECT 'e', 3, 1 FROM DUAL
UNION ALL SELECT 'f', 3, 1 FROM DUAL
UNION ALL SELECT 'g', 4, 2 FROM DUAL
UNION ALL SELECT 'h', 4, 2 FROM DUAL
UNION ALL SELECT 'i', 5, 2 FROM DUAL
UNION ALL SELECT 'j', 5, 2 FROM DUAL;

Fråga 1 :

SELECT DISTINCT
  MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS min_sal_first_sal,
  MAX(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) AS max_sal_first_sal,
  MIN(name) 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,
  MIN(name) KEEP (DENSE_RANK LAST 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,
  deptno
FROM test

Resultat :

| 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 |                  a |                  c |                 e |                 f |      1 |
|                 4 |                 4 |                  g |                  h |                 i |                 j |      2 |


  1. Android - Cursor onMapReady (Markörer)

  2. De bästa sätten att öka databaseffektiviteten

  3. MariaDB ROUND() vs FLOOR()

  4. PostgreSQL unnest() med elementnummer