إنتقال للمحتوى

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

بيانات الموظف الذى يمتلك خامس أعلى مرتب


4 رد (ردود) على هذا الموضوع

#1 hanyfreedom

hanyfreedom

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,481 مشاركة
  • البـلـد: Country Flag
  • الاهتمامات:Chess , Sudoku

تاريخ المشاركة 04 July 2007 - 01:49 PM

لكى نحضر جميع بيانات الموظف الذى يمتلك خامس أعلى مرتب من جدول ال Emp نقوم بتنفيذ الكود التالى :-

SELECT empno,ename,sal, rn FROM
(SELECT a.*, dense_rank() OVER(ORDER BY sal DESC) rn FROM emp a )
where rn=5;


أنا أريد تفسير لهذا الكود لأن به دالة جديدة و هى ال

(dense_rank() OVER(ORDER BY sal DESC

و هى دالة انا لم أتعرض لها من قبل ....... فأرجو الأفادة و شكراً


#2 -=|mOOdY|=-

-=|mOOdY|=-

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,324 مشاركة

تاريخ المشاركة 04 July 2007 - 02:30 PM

اخي الفاضل الدالة rank والدالة dense_rank هما من الدوالالتي تستعمل تحليليا analytic بهدف الترتيب

هذا المقال سيجيب عن كل تساؤلاتك

RANK, DENSE_RANK, FIRST and LAST Analytic Functions
The following examples use the EMP table from the SCOTT sample schema, which is created as follows.

CONN sys/password AS SYSDBA

	-- Create SCOTT schema if you don't currently have it.
	@$ORACLE_HOME/rdbms/admin/utlsampl.sql
	ALTER USER scott IDENTIFIED BY tiger ACCOUNT UNLOCK;

Let's assume we want to assign a sequential order, or rank, to people within a department based on salary, we might use the RANK function like:

SELECT deptno,
		   ename,
		   sal,
		   RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank"
	FROM   emp
	WHERE  deptno = 30;

		DEPTNO ENAME			 SAL	   rank
	---------- ---------- ---------- ----------
			30 JAMES			 950		  1
			30 WARD			 1250		  2
			30 MARTIN		   1250		  2
			30 TURNER		   1500		  4
			30 ALLEN			1600		  5
			30 BLAKE			2850		  6

What we see here is where two people have the same salary they are assigned the same rank. When multiple rows share the same rank the next rank in the sequence is not consecutive.

The DENSE_RANK function works acts like the RANK function except that it assigns consecutive ranks:

SELECT deptno,
		   ename,
		   sal,
		   DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank"
	FROM   emp
	WHERE  deptno = 30;

		DEPTNO ENAME			 SAL	   rank
	---------- ---------- ---------- ----------
			30 JAMES			 950		  1
			30 WARD			 1250		  2
			30 MARTIN		   1250		  2
			30 TURNER		   1500		  3
			30 ALLEN			1600		  4
			30 BLAKE			2850		  5

The FIRST and LAST functions can be used to return the first or last value from an ordered sequence. Say we want to display the salary of each employee, along with the lowest and highest within their department we may use something like:

SELECT deptno,
		   ename,
		   sal,
		   MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) "Lowest",
		   MAX(sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) "Highest"
	FROM   emp
	ORDER BY deptno, sal;

		DEPTNO ENAME			 SAL	 Lowest	Highest
	---------- ---------- ---------- ---------- ----------
			10 MILLER		   1300	   1300	   5000
			10 CLARK			2450	   1300	   5000
			10 KING			 5000	   1300	   5000
			20 SMITH			 800		800	   3000
			20 ADAMS			1100		800	   3000
			20 JONES			2975		800	   3000
			20 SCOTT			3000		800	   3000
			20 FORD			 3000		800	   3000
			30 JAMES			 950		950	   2850
			30 WARD			 1250		950	   2850
			30 MARTIN		   1250		950	   2850

		DEPTNO ENAME			 SAL	 Lowest	Highest
	---------- ---------- ---------- ---------- ----------
			30 TURNER		   1500		950	   2850
			30 ALLEN			1600		950	   2850
			30 BLAKE			2850		950	   2850


بالتوفيق

صورة

!!! كم أنت عبقري !!!


#3 Rolo

Rolo

    عضو

  • الأعضــاء
  • 18 مشاركة

تاريخ المشاركة 04 July 2007 - 05:18 PM

اخواني انا تعرض لي هذا السؤال من قبل ولم اعارف ان في دالة بهذا الاسم بس برضو سمعت ان ممكن الحصول علي نفس النتيجة بدون الدالية بسب كويري في فروم كلاوس لو حد يعرف الطريقة التانية يعرضها للاستفادة

#4 bahaa_esmail

bahaa_esmail

    عضو

  • الأعضــاء
  • 28 مشاركة

تاريخ المشاركة 13 July 2007 - 12:58 AM

أخوكم بهاء هذا هو الكود التالى :-

select empno,ename,sal,rownum
from (select empno,ename,sal from emp order by sal desc)
where rownum=5;


يارب اكون أفتك

b_bocka@yahoo.com

#5 محمد الشحات

محمد الشحات

    عضو نشط

  • الأعضــاء
  • 295 مشاركة

تاريخ المشاركة 13 July 2007 - 01:28 AM

الاخ / هانى
لو انت عاوز تفسير للداله اعتقد الاخوه قاموا بالللازم
اما لو كان يهمك النتيجه فاعتقد دى ممكن نعملها ببساطه باستخدام ال cursor
أفضل الذكر " لا اله إلا الله "