এসকিউএল র‌্যাঙ্ক () বনাম ROW_NUMBER ()


189

আমি এইগুলির মধ্যে পার্থক্য সম্পর্কে বিভ্রান্ত। নিম্নলিখিত এসকিউএল চালানো আমাকে দুটি সনাক্তকারী ফলাফল সেট পেয়েছে। কেউ দয়া করে পার্থক্য ব্যাখ্যা করতে পারেন?

SELECT ID, [Description], RANK()       OVER(PARTITION BY StyleID ORDER BY ID) as 'Rank'      FROM SubStyle
SELECT ID, [Description], ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) as 'RowNumber' FROM SubStyle

উত্তর:


221

ROW_NUMBER: 1 দিয়ে শুরু করে প্রতিটি সারির জন্য একটি অনন্য নম্বর দেয়।

র‌্যাঙ্ক: সদৃশ মান রয়েছে এমন সারিগুলি ব্যতীত প্রতিটি সারিটির জন্য 1 দিয়ে শুরু করে একটি অনন্য সংখ্যা নির্ধারণ করে, একই ক্ষেত্রে একই র‌্যাঙ্কিং নির্ধারিত হয় এবং প্রতিটি সদৃশ র‌্যাঙ্কিংয়ের ক্রমটিতে একটি ফাঁক উপস্থিত হয়।


324

কোনও নির্দিষ্ট ক্রম মানের জন্য পার্টিশনের মধ্যে আপনার যদি সম্পর্ক থাকে তবেই আপনি পার্থক্যটি দেখতে পাবেন।

RANKএবং DENSE_RANKএই ক্ষেত্রে নির্মাতারাবাদী, ক্রম এবং বিভাজন উভয় কলামের জন্য একই মানযুক্ত সমস্ত সারি সমান ফলাফলের সাথে শেষ হবে, যেখানে ROW_NUMBERনির্বিচারে (নির্বিচারে) বাঁধা সারিগুলিতে একটি বর্ধমান ফলাফল নির্ধারণ করবে।

উদাহরণ: (সমস্ত সারি একইরূপে StyleIDএকই পার্টিশনে রয়েছে এবং সেই বিভাগের মধ্যে প্রথম 3 টি সারি যখন আদেশ করা হয় তখন বেঁধে দেওয়া হয় ID)

WITH T(StyleID, ID)
     AS (SELECT 1,1 UNION ALL
         SELECT 1,1 UNION ALL
         SELECT 1,1 UNION ALL
         SELECT 1,2)
SELECT *,
       RANK() OVER(PARTITION BY StyleID ORDER BY ID)       AS 'RANK',
       ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS 'ROW_NUMBER',
       DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'DENSE_RANK'
FROM   T  

রিটার্নস

StyleID     ID       RANK      ROW_NUMBER      DENSE_RANK
----------- -------- --------- --------------- ----------
1           1        1         1               1
1           1        1         2               1
1           1        1         3               1
1           2        4         4               2

আপনি দেখতে পাচ্ছেন যে তিনটি অভিন্ন সারিগুলির জন্য ROW_NUMBERবৃদ্ধিগুলি, RANKমান একই থাকে তারপরে এটি লাফিয়ে যায় 4DENSE_RANKতিনটি সারিতে একই র‌্যাঙ্ক বরাদ্দ করে কিন্তু তারপরে পরবর্তী স্বতন্ত্র মানটি 2 এর মান নির্ধারিত হয়।


26
দুর্দান্ত! ... DENSE_RANK সম্পর্কে উল্লেখ করার জন্য ধন্যবাদ
সন্দীপ থমাস

7
একটি দুর্দান্ত উদাহরণের জন্য ধন্যবাদ। ROW_NUMBER () আরও অনেক বেশি উপযুক্ত হতে পারলে আমি ভুল করে RANK () ফাংশনটি ব্যবহার করছি তা বুঝতে আমাকে সহায়তা করে।
এলেস পোটোকনিক হাহোনিনা

2
গম্ভীরভাবে, এটি দুর্দান্ত।
ম্যাট ফেলজানি

35

এই নিবন্ধটি ROW_NUMBER()এবংDENSE_RANK() ( RANK()ফাংশনটি বিশেষভাবে চিকিত্সা করা হয় না) এর মধ্যে একটি আকর্ষণীয় সম্পর্ককে কভার করে । আপনার যখন ROW_NUMBER()কোনও SELECT DISTINCTবিবৃতিতে জেনারেট হওয়া দরকার , কীওয়ার্ড দ্বারা মুছে ROW_NUMBER()ফেলার আগেই স্বতন্ত্র মানগুলি তৈরি করবে DISTINCT। যেমন এই ক্যোয়ারী

SELECT DISTINCT
  v, 
  ROW_NUMBER() OVER (ORDER BY v) row_number
FROM t
ORDER BY v, row_number

... এই ফলাফল উত্পাদন করতে পারে ( DISTINCTকোন প্রভাব নেই):

+---+------------+
| V | ROW_NUMBER |
+---+------------+
| a |          1 |
| a |          2 |
| a |          3 |
| b |          4 |
| c |          5 |
| c |          6 |
| d |          7 |
| e |          8 |
+---+------------+

যেখানে এই ক্যোয়ারী:

SELECT DISTINCT
  v, 
  DENSE_RANK() OVER (ORDER BY v) row_number
FROM t
ORDER BY v, row_number

... আপনি সম্ভবত যা চান তা উত্পাদন করে:

+---+------------+
| V | ROW_NUMBER |
+---+------------+
| a |          1 |
| b |          2 |
| c |          3 |
| d |          4 |
| e |          5 |
+---+------------+

মনে রাখবেন যে, ORDER BYধারা DENSE_RANK()ফাংশন থেকে সব অন্যান্য কলাম প্রয়োজন হবে SELECT DISTINCTসঠিকভাবে কাজ করার জন্য ধারা।

এর কারণ হ'ল যুক্তিযুক্তভাবে, উইন্ডো ফাংশনগুলি DISTINCTপ্রয়োগ করার আগে গণনা করা হয়

তুলনায় তিনটি ফাংশন

PostgreSQL / Sybase / SQL স্ট্যান্ডার্ড সিনট্যাক্স ( WINDOWধারা) ব্যবহার:

SELECT
  v,
  ROW_NUMBER() OVER (window) row_number,
  RANK()       OVER (window) rank,
  DENSE_RANK() OVER (window) dense_rank
FROM t
WINDOW window AS (ORDER BY v)
ORDER BY v

... তুমি পাবে:

+---+------------+------+------------+
| V | ROW_NUMBER | RANK | DENSE_RANK |
+---+------------+------+------------+
| a |          1 |    1 |          1 |
| a |          2 |    1 |          1 |
| a |          3 |    1 |          1 |
| b |          4 |    4 |          2 |
| c |          5 |    5 |          3 |
| c |          6 |    5 |          3 |
| d |          7 |    7 |          4 |
| e |          8 |    8 |          5 |
+---+------------+------+------------+

1
ROW_NUMBER এবং DENSE_RANK উভয়ই স্বতন্ত্র প্রয়োগের আগে মান উত্পাদন করে। আসলে সমস্ত র‌্যাঙ্কিং ফাংশন বা যে কোনও ফাংশন DISTINCT প্রয়োগ করার আগে ফলাফল তৈরি করে।
থানাসিস আইওনানিডিস

1
@ থানাসিস আইওনানিডিস: একেবারে। আমি আমার উত্তরটি একটি ব্লগ পোস্টের লিঙ্কের সাথে আপডেট করেছি, যেখানে আমি এসকিউএল অপারেশনগুলির আসল
লুকাশ এদার

3

খুব সামান্য:

সারিটির র‌্যাঙ্ক একাধিক সংখ্যক র‌্যাঙ্কের সংখ্যা যা প্রশ্নযুক্ত সারির আগে আসে।

Row_number হল সারিগুলির স্বতন্ত্র র‌্যাঙ্ক, র‌্যাঙ্কিংয়ের কোনও ফাঁক ছাড়াই।

http://www.bidn.com/blogs/marcoadf/bidn-blog/379/ranking-functions-row_number-vs-rank-vs-dense_rank-vs-ntile


আহ, আমি মনে করি এটিই আমি অনুপস্থিত ছিল -> Row_number হ'ল র‌্যাঙ্কের কোনও ফাঁক ছাড়াই সারির স্বতন্ত্র র‌্যাঙ্ক।
ডটনেট শখ 22

1

পার্টিশন ধারা ছাড়া সহজ প্রশ্ন:

select 
    sal, 
    RANK() over(order by sal desc) as Rank,
    DENSE_RANK() over(order by sal desc) as DenseRank,
    ROW_NUMBER() over(order by sal desc) as RowNumber
from employee 

আউটপুট:

    --------|-------|-----------|----------
    sal     |Rank   |DenseRank  |RowNumber
    --------|-------|-----------|----------
    5000    |1      |1          |1
    3000    |2      |2          |2
    3000    |2      |2          |3
    2975    |4      |3          |4
    2850    |5      |4          |5
    --------|-------|-----------|----------

0

এই উদাহরণ দেখুন।

CREATE TABLE [dbo].#TestTable(
    [id] [int] NOT NULL,
    [create_date] [date] NOT NULL,
    [info1] [varchar](50) NOT NULL,
    [info2] [varchar](50) NOT NULL,
)

কিছু তথ্য Inোকান

INSERT INTO dbo.#TestTable (id, create_date, info1, info2)
VALUES (1, '1/1/09', 'Blue', 'Green')
INSERT INTO dbo.#TestTable (id, create_date, info1, info2)
VALUES (1, '1/2/09', 'Red', 'Yellow')
INSERT INTO dbo.#TestTable (id, create_date, info1, info2)
VALUES (1, '1/3/09', 'Orange', 'Purple')
INSERT INTO dbo.#TestTable (id, create_date, info1, info2)
VALUES (2, '1/1/09', 'Yellow', 'Blue')
INSERT INTO dbo.#TestTable (id, create_date, info1, info2)
VALUES (2, '1/5/09', 'Blue', 'Orange')
INSERT INTO dbo.#TestTable (id, create_date, info1, info2)
VALUES (3, '1/2/09', 'Green', 'Purple')
INSERT INTO dbo.#TestTable (id, create_date, info1, info2)
VALUES (3, '1/8/09', 'Red', 'Blue')

1 এর জন্য একই মানগুলি পুনরাবৃত্তি করুন

ডিবিওতে প্রবেশ করুন

সমস্ত দেখুন

SELECT * FROM #TestTable

আপনার ফলাফল দেখুন

SELECT Id,
    create_date,
    info1,
    info2,
    ROW_NUMBER() OVER (PARTITION BY Id ORDER BY create_date DESC) AS RowId,
    RANK() OVER(PARTITION BY Id ORDER BY create_date DESC)    AS [RANK]
FROM #TestTable

বিভিন্ন বুঝতে হবে


-1

এছাড়াও, র‌্যাঙ্ক ব্যবহারের সময় পার্টিশনে অর্ডার বাই মনোযোগ দিন (উদাহরণস্বরূপ স্ট্যান্ডার্ড অ্যাডভেঞ্চার ওয়ার্কস ডিবি ব্যবহৃত হয়)।

As1.SalesOrderID, as1.SalesOrderDetailID, RANK () OVER (as1 দ্বারা বিক্রয় বিক্রয় ওর্ডারআইডি = 43659 অর্ডার বিক্রয় বিক্রয় অর্ডারডেটাইল আইডি দ্বারা;

ফলাফল দেয়:

SalesOrderID SalesOrderDetailID rank_same_as_partition rank_salesorderdetailid
43659 1 1 1
43659 2 1 2
43659 3 1 থেকে 3
43659 4 1 4
43659 5 1 থেকে 5
43659 6 1 6
43659 7 1 7
43659 8 1 8
43659 9 1 9
43659 10 1 10
43659 11 1 11
43659 12 1 12

তবে যদি আদেশটি পরিবর্তিত করে (অর্ডারকিটি ব্যবহার করুন:

As1.SalesOrderID, as1.OrderQty, RANK () OVER (as1.SalesOrderID দ্বারা অর্ডার) বিভাগ বিক্রয় ওর্ডারআইডি = 43659 অর্ডারকটি দ্বারা অর্ডার;

দেয়:

বিক্রয় ওর্ডারআইডির অর্ডারকিটি র‌্যাঙ্ক_সেলসর্ডারিড র‌্যাঙ্ক_অর্ডারকিটি
43659 1 1 1
43659 1 1 1
43659 1 1
43659 1 1 1
43659 1 1
43659 1 1 1
43659 2 1 7
43659 2 1 7
43659 3 1 9
43659 3 1 9
43659 4 1 11
43659 6 1 12

অর্ডার বাই দ্বারা অর্ডারকিটি (ডানদিকের কলাম দ্বিতীয় সারণী) ব্যবহার করার পরে কীভাবে র‌্যাঙ্ক পরিবর্তিত হয় তা আমরা কীভাবে পরিবর্তন করি এবং অর্ডার বাই-এর সেলস অর্ডারডেটাইলআইড (ডানদিকেতম কলামের প্রথম সারণী) ব্যবহার করি তখন তা কীভাবে পরিবর্তিত হয় তা লক্ষ করুন।


-1

র‌্যাঙ্কের সাহায্যে আমি কিছু করি নি, তবে আজ সারি_ সংখ্যা () দিয়ে এটি আবিষ্কার করেছি।

select item, name, sold, row_number() over(partition by item order by sold) as row from table_name

এর ফলে কিছু পুনরাবৃত্তি করা সারি সংখ্যার ফলাফল হবে যেহেতু আমার ক্ষেত্রে প্রতিটি নাম সমস্ত আইটেম ধারণ করে। প্রতিটি আইটেমের অর্ডার দেওয়া হবে কতগুলি বিক্রি হয়েছিল।

+--------+------+-----+----+
|glasses |store1|  30 | 1  |
|glasses |store2|  35 | 2  |
|glasses |store3|  40 | 3  |
|shoes   |store2|  10 | 1  |
|shoes   |store1|  20 | 2  |
|shoes   |store3|  22 | 3  |
+--------+------+-----+----+
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.