در مورد تابع های dense rank و rank و حتی ntile در sql server
با سلام و خسته نباشید خدمت شما
من تابع های denserank و rank و ntile را خیلی بررسی کرده ام فقط یک سئوال داشتم و آن این هست که مثلا ایده استفاده از تابع denserank چیست یعنی در چه مواردی استفاده دارد و کجاها استفاده می شود مثلا اگر زحمت نیست چند مورد رابیان کنید حتی اگر ممکن هست تابع های rank و ntile را هم توضیح دهید که در چه مواردی استفاده دارند.
ممنونم که راهنمایی می کنید.
مچکرم.
5 پاسخ
با سلام و خسته نباشید خدمت شما
خیلی زحمت کشیدید اما مهندس جان منظور من این بود که در چه مواردی کاربرد دارد یعنی مثلا چه استفاده هایی دارد در پروژه هایی که استفاده می شود
ممنونم از شما
با سلام و خسته نباشید خدمت شما دوست عزیز
جناب مهندس عزیز ایده را گرفتم فقط اگر زحمت نیست می توانید در مورد تابع dense_rank یا rank یک مثال دیگر هم بزنید ممنون می شوم
اگر هم می توانید در مورد تابع ntile یک ایده را بیان کنید.
با تشکر از شما
مچکرم
هر دوی اینها رنک سطر مشخصی رو در بین گروهی از سطرها که در دستور مشخص شده رو به صورت عدد برمیگردونه با این تفاوت که rank بصورت غیرمتداوم و غیرمنظم ولی denserank بصورت مرتب
SELECT empno, deptno, sal, RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank" FROM emp; EMPNO DEPTNO SAL rank ---------- ---------- ---------- ---------- 7934 10 1300 1 7782 10 2450 2 7839 10 5000 3 7369 20 800 1 7876 20 1100 2 7566 20 2975 3 7788 20 3000 4 7902 20 3000 4 7900 30 950 1 7654 30 1250 2 7521 30 1250 2 7844 30 1500 4 7499 30 1600 5 7698 30 2850 6 SELECT empno, deptno, sal, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank" FROM emp; EMPNO DEPTNO SAL rank ---------- ---------- ---------- ---------- 7934 10 1300 1 7782 10 2450 2 7839 10 5000 3 7369 20 800 1 7876 20 1100 2 7566 20 2975 3
nlite هم گروههای مختلف سطرها رو با پارامترهای مشخص شده در دستور توزیع میکنه
دستور
USE AdventureWorks2012; GO SELECT p.FirstName, p.LastName ,NTILE(4) OVER(ORDER BY SalesYTD DESC) AS Quartile ,CONVERT(nvarchar(20),s.SalesYTD,1) AS SalesYTD , a.PostalCode FROM Sales.SalesPerson AS s INNER JOIN Person.Person AS p ON s.BusinessEntityID = p.BusinessEntityID INNER JOIN Person.Address AS a ON a.AddressID = p.BusinessEntityID WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0; GO
نتیجه
FirstName LastName Quartile SalesYTD PostalCode ------------- --------------------- --------- -------------- ---------- Linda Mitchell 1 4,251,368.55 98027 Jae Pak 1 4,116,871.23 98055 Michael Blythe 1 3,763,178.18 98027 Jillian Carson 1 3,189,418.37 98027 Ranjit Varkey Chudukatil 2 3,121,616.32 98055 José Saraiva 2 2,604,540.72 98055 Shu Ito 2 2,458,535.62 98055 Tsvi Reiter 2 2,315,185.61 98027 Rachel Valdez 3 1,827,066.71 98055 Tete Mensa-Annan 3 1,576,562.20 98055 David Campbell 3 1,573,012.94 98055 Garrett Vargas 4 1,453,719.47 98027 Lynn Tsoflias 4 1,421,810.92 98055 Pamela Ansman-Wolfe 4 1,352,577.13 98027 (14 row(s) affected)
در مثال زیر ببینید با روش رنک و دی رنک کارمندان یک شرکت در بخش های مختلف بر اساس حقوق رنک بندی شدن تفاوت رو ببینید متوجه میشید
SELECT empno, deptno, sal, RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank" FROM emp; EMPNO DEPTNO SAL rank ---------- ---------- ---------- ---------- 7934 10 1300 1 7782 10 2450 2 7839 10 5000 3 7369 20 800 1 7876 20 1100 2 7566 20 2975 3 7788 20 3000 4 7902 20 3000 4 7900 30 950 1 7654 30 1250 2 7521 30 1250 2 7844 30 1500 4 7499 30 1600 5 7698 30 2850 6
SELECT empno, deptno, sal, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank" FROM emp; EMPNO DEPTNO SAL rank ---------- ---------- ---------- ---------- 7934 10 1300 1 7782 10 2450 2 7839 10 5000 3 7369 20 800 1 7876 20 1100 2 7566 20 2975 3 7788 20 3000 4 7902 20 3000 4 7900 30 950 1 7654 30 1250 2 7521 30 1250 2 7844 30 1500 3 7499 30 1600 4 7698 30 2850 5 SQL>