Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle में KEEP के साथ और उसके बिना विभाजन

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

कथन पर (मोटे तौर पर) दाएं से बाएं क्रम में विचार किया जा सकता है:

  • OVER (PARTITION BY deptno) इसका अर्थ है पंक्तियों को deptno . के अलग-अलग समूहों में विभाजित करना; तब
  • ORDER BY sal मतलब, प्रत्येक विभाजन के लिए, पंक्तियों को sal . द्वारा क्रमित करें (निहित रूप से ASC . का उपयोग करना अंतिम आदेश); तब
  • KEEP (DENSE_RANK FIRST इसका मतलब है कि प्रत्येक विभाजन के लिए क्रमबद्ध पंक्तियों को एक (लगातार) रैंकिंग दें (क्रमबद्ध स्तंभों के लिए समान मूल्यों वाली पंक्तियों को समान रैंक दी जाएगी) और उन सभी पंक्तियों को त्याग दें जो पहले स्थान पर नहीं हैं; और अंत में
  • MIN(sal) प्रत्येक विभाजन की शेष पंक्तियों के लिए, न्यूनतम वेतन लौटाएं।

इस मामले में MIN और DENSE_RANK FIRST दोनों sal . पर काम कर रहे हैं कॉलम तो वही काम करेगा और KEEP (DENSE_RANK FIRST ORDER BY sal) बेमानी है।

हालांकि यदि आप न्यूनतम के लिए एक अलग कॉलम का उपयोग करते हैं तो आप प्रभाव देख सकते हैं:

एसक्यूएल फिडल

Oracle 11g R2 स्कीमा सेटअप :

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;

क्वेरी 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

परिणाम :

| 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle में यूनिक्स टाइमस्टैम्प कैसे लौटाएं?

  2. बल्क संग्रह का उपयोग करते हुए LIMIT के लिए मान सेट करना

  3. भौतिक दृश्य बनाम टेबल्स:क्या फायदे हैं?

  4. Oracle में NULLIF () फ़ंक्शन

  5. अलग-अलग स्कीमा से दो टेबल पूछें