আমি কীভাবে ROW_NUMBER () ব্যবহার করব?


175

আমি এইটি পেতে ব্যবহার ROW_NUMBER()করতে চাই ...

  1. পেতে max(ROW_NUMBER())-> অথবা আমি অনুমান এই সব সারি গণনা হবে

আমি চেষ্টা করেছিলাম:

SELECT max(ROW_NUMBER() OVER(ORDER BY UserId)) FROM Users

কিন্তু এটি কাজ করে বলে মনে হচ্ছে না ...

  1. ROW_NUMBER()প্রদত্ত তথ্যের টুকরোটি ব্যবহার করার জন্য, যেমন। যদি আমার কোনও নাম থাকে এবং আমি জানতে চাই যে নামটিটি কী সারি থেকে এসেছে।

আমি ধরে নিলাম এটি # 1 এর জন্য যা চেষ্টা করেছি তার অনুরূপ কিছু হবে

SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'

তবে এটিও কার্যকর হয়নি ...

কোন ধারনা?

উত্তর:


150

প্রথম প্রশ্নের জন্য, কেন শুধু ব্যবহার করবেন না?

SELECT COUNT(*) FROM myTable 

গণনা পেতে।

এবং দ্বিতীয় প্রশ্নের জন্য, সারিটির প্রাথমিক কীটি কোনও নির্দিষ্ট সারি চিহ্নিত করতে ব্যবহার করা উচিত। তার জন্য সারি নম্বর ব্যবহার করে দেখুন না।


আপনি যদি আপনার মূল প্রশ্নের মধ্যে Row_Number () ফেরত দিয়ে থাকেন,

SELECT ROW_NUMBER() OVER (Order by Id) AS RowNumber, Field1, Field2, Field3
FROM User

তারপরে আপনি যখন 5 টি সারি পিছনে যেতে চান তখন আপনি বর্তমান সারি নম্বরটি নিতে পারেন এবং বর্তমানের -5 দিয়ে সারিটি নির্ধারণ করতে নিম্নলিখিত কোয়েরিটি ব্যবহার করতে পারেন

SELECT us.Id
FROM (SELECT ROW_NUMBER() OVER (ORDER BY id) AS Row, Id
     FROM User ) us 
WHERE Row = CurrentRow - 5   

আমার পরিস্থিতিতে আমাকে একটি ইউজারআইডি দেওয়া হয়েছে, এবং আমি ইউজারআইডিটি পেতে চাই যা একটি নির্দিষ্ট সংখ্যক সারি ফিরে আসে। যদি একটি সারি মুছে ফেলা হয়? সেক্ষেত্রে আমি কেবল ইউজারআইডি - অফসেটে যেতে পারি না, কারণ তখন আমি সঠিক রেকর্ডটি পাই না।

রেকর্ডের গণনাটি নির্বাচন করতে mytable থেকে নির্বাচিত গণনা (1) ব্যবহার করা ভাল। এটি এত দ্রুত এবং দক্ষ
শিবাজিথ

46

যদিও আমি অন্যদের সাথে একমত হয়েছি যে আপনি count()মোট সারি সংখ্যা পেতে ব্যবহার করতে পারেন, আপনি এখানে কীভাবে ব্যবহার করতে পারেন তা এখানে row_count():

  1. মোট সারির সংখ্যা পেতে:

    with temp as (
        select row_number() over (order by id) as rownum
        from table_name 
    )
    select max(rownum) from temp
  2. নাম স্যাটেল যেখানে সারি নম্বর পেতে:

    with temp as (
        select name, row_number() over (order by id) as rownum
        from table_name
    )
    select rownum from temp where name like 'Matt'

আপনি আরও ব্যবহার করতে পারেন min(rownum)বা max(rownum)ম্যাট এর জন্য যথাক্রমে প্রথম বা শেষ সারিটি পেতে পারেন ।

এগুলি ছিল খুব সাধারণ বাস্তবায়ন row_number()। আপনি আরও জটিল গ্রুপিংয়ের জন্য এটি ব্যবহার করতে পারেন। সাব কোয়েরি না করে অ্যাডভান্সড গ্রুপিংয়ে আমার প্রতিক্রিয়া পরীক্ষা করে দেখুন


আপনি কি দয়া করে ব্যাখ্যা করতে পারেন যে কীভাবে ব্যবহৃত কলামটি চয়ন করবেন order by X? অন্য কথায়, কীভাবে Xনির্ধারণ করা উচিত ? ধন্যবাদ!
কেভিন মেরেডিথ

@ কেভিনমারেডিথ: order by Xসারিগুলি নির্ধারিত হবে তা নির্ধারণ করতে আপনি যে আদেশটি ব্যবহার করবেন তা হ'ল ROW_NUMBERS()। মনে রাখবেন যে সম্পর্কযুক্ত ডাটাবেসে টেবিলগুলির নাম থাকা সত্ত্বেও আনুষ্ঠানিক অর্ডিং নেই, সুতরাং আপনি যদি একটি সারি "1" বা "10" বা "1337" কল করতে চান তবে আপনাকে প্রথমে একটি ORDER BYধারা ব্যবহার করে তাদের আদেশ করতে হবে , যা OVER (ORDER BY X)ধারাটি যে এক হয় ।
Wtrmute

25

আপনি যদি টেবিলের মোট সারির গণনাটি ফেরত নিতে চান তবে আপনি SELECT COUNT(*)বিবৃতিতে বিকল্প উপায় ব্যবহার করতে পারেন ।

যেহেতু SELECT COUNT(*)সারি গণনা ফিরিয়ে দেওয়ার জন্য একটি পূর্ণ টেবিল স্ক্যান করে, এটি একটি বড় টেবিলের জন্য খুব দীর্ঘ সময় নিতে পারে। আপনি এক্ষেত্রে sysindexesসিস্টেম টেবিলটি ব্যবহার করতে পারেন । এমন একটি ROWSকলাম রয়েছে যা আপনার ডাটাবেসে প্রতিটি সারণীর জন্য মোট সারি গণনা করে। আপনি নিম্নলিখিত নির্বাচন বিবৃতি ব্যবহার করতে পারেন:

SELECT rows FROM sysindexes WHERE id = OBJECT_ID('table_name') AND indid < 2

এটি আপনার ক্যোয়ারির সময় নেয়ামতভাবে হ্রাস করবে।


আপনি পুরো টেবিল স্ক্যান সম্পর্কে ঠিক বলেছেন তবে নোট করুন যে এটি অবিচ্ছিন্নভাবে একটি ক্লাস্টারড ইনডেক্স স্ক্যান নয়, কারণ এটির জন্য এটি একটি ক্লাস্টারযুক্ত সূচক ব্যবহার করতে পারে
yoel halb

2
এছাড়াও এটি কেবল এসকিএল-সার্ভারের ক্ষেত্রেই সত্য, কারণ অন্যান্য আরডিএমবিএস নির্বাচনের গণনাটি অনুকূল করেছে
yoel halb

7

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

ROW_NUMBER() OVER (ORDER BY 'Column_Name' DESC) as ROW_NUMBER

আপনি মধ্যে পার্থক্য জানতে পারেন Row_number(), Rank()এবং Dense_Rank() এখানে


7

আপনি যেখানে শর্ত রয়েছে সেখানে প্রথম রেকর্ড পেতে এটি ব্যবহার করতে পারেন

SELECT TOP(1) * , ROW_NUMBER() OVER(ORDER BY UserId) AS rownum 
FROM     Users 
WHERE    UserName = 'Joe'
ORDER BY rownum ASC

4
SELECT num, UserName FROM 
 (SELECT UserName, ROW_NUMBER() OVER(ORDER BY UserId) AS num
  From Users) AS numbered
WHERE UserName='Joe'

সমস্ত সারি গণনার জন্য - অন্যথায় আপনি কেবল সারিগুলি গণনা করছেন যেখানে ব্যবহারকারীর নাম জো, যা লক্ষ্য নয় ;-)।
অ্যালেক্স মার্টেলি

1
@ ম্যাট: আমাকে প্যাডেন্ট বলুন; আমি "উপ-নির্বাচন" শব্দটির চেয়ে "উত্সযুক্ত টেবিল" বা "বেনামে ভিউ" পছন্দ করি।
যান্ত্রিক_মিট

1
@ অ্যাডাম, আমি যেমন একজন পেডেন্ট - "নেস্টেড সিলেক্ট" আপনাকে কি আরও সুখী করবে? আমি যেমন টেবিল বা দৃশ্য যখন কোন হিসাবে ব্যবহারের শর্তাবলী পছন্দ করি না TABLEবা VIEWশব্দ প্রায় ... কিন্তু SELECT!) - নিশ্চিত
অ্যালেক্স Martelli

@ অ্যালেক্স: আপনি একটি বৈধ পয়েন্ট উপস্থাপন করুন। "নেস্টেড সিলেক্ট" আমার জন্য দুর্দান্ত কাজ করে :) যাইহোক, আপনি আপনার মন্তব্য এবং উত্তরগুলিতে যুক্ত করেছেন এমন উপাখ্যানগুলি পড়তে আমি সত্যিই আনন্দিত।
যান্ত্রিক_মিট

@ অ্যাডাম, ধন্যবাদ! কখনও কখনও আমার উত্তরগুলি খুব খালি কোড হিসাবে এখানে থাকে, তবে আমি যখন আমি অতিরিক্ত মিনিট থাকি তখন আমি তাদের মাংস দিতে ভালবাসি ;-)।
অ্যালেক্স মার্টেলি

4

এখানে প্রশ্নের সাথে সম্পর্কিত হতে পারে না। তবে আমি খুঁজে পেলাম যে এটি ব্যবহারের সময় কার্যকর হতে পারে ROW_NUMBER-

SELECT *,
ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS Any_ID 
FROM #Any_Table


2

আপনি যদি একেবারে এর জন্য ROW_NUMBER ব্যবহার করতে চান (গণনার পরিবর্তে (*)) আপনি সর্বদা ব্যবহার করতে পারেন:

SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY Id)   
FROM USERS  
ORDER BY ROW_NUMBER() OVER (ORDER BY Id) DESC

2

আপনি Row_Numberসীমা ক্যোয়ারী ফলাফলের জন্য ব্যবহার করতে পারেন ।

উদাহরণ:

SELECT * FROM (
    select row_number() OVER (order by createtime desc) AS ROWINDEX,* 
    from TABLENAME ) TB
WHERE TB.ROWINDEX between 0 and 10

- উপরের ক্যোয়ারী সহ, আমি ফলাফলের 1 পৃষ্ঠায় পেয়েছি TABLENAME


2

ব্যবহার করে ভার্চুয়াল টেবিল তৈরি করা দরকার WITH table ASযা প্রদত্ত কোয়েরিতে উল্লেখ রয়েছে।

এই ভার্চুয়াল টেবিলটি ব্যবহার করে আপনি সিআরইউডি অপারেশন আর্ট করতে পারবেন row_number

প্রশ্ন:

WITH table AS
-
(SELECT row_number() OVER(ORDER BY UserId) rn, * FROM Users)
-
SELECT * FROM table WHERE UserName='Joe'
-

আপনি ব্যবহার করতে পারেন INSERT, UPDATEঅথবা DELETEসত্ত্বেও গত বাক্যে SELECT


0

এসকিউএল রো_ নাম্বার () ফাংশনটি সম্পর্কিত রেকর্ড সেটে ডেটা সারিগুলিতে একটি অর্ডার নম্বর সাজাতে এবং নির্ধারণ করা হয়। সুতরাং এটি সারি সংখ্যায় ব্যবহৃত হয়, উদাহরণস্বরূপ শীর্ষ ১০ টি সারি চিহ্নিত করতে যা সর্বাধিক অর্ডারের পরিমাণ রয়েছে বা প্রতিটি গ্রাহকের ক্রম সনাক্ত করতে যা সর্বোচ্চ পরিমাণ ইত্যাদি etc.

আপনি যদি বিভাগে বিভাজন সহ Row_Number () ব্যবহার করেন তবে বিভাগে বিভাগে বিভাজন করে যদি প্রতিটি সারিটি ডেটাসেট এবং নম্বরটি সৃজন করতে চান তবে। উদাহরণস্বরূপ, প্রতিটি গ্রাহকের নিজের মধ্যে অর্ডার বাছাই করা যেখানে ডেটাসেটে সমস্ত আদেশ থাকে ইত্যাদি etc.

SELECT
    SalesOrderNumber,
    CustomerId,
    SubTotal,
    ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY SubTotal DESC) rn
FROM Sales.SalesOrderHeader

তবে আমি যেমন বুঝতে পেরেছি আপনি একটি কলাম দ্বারা গোষ্ঠীযুক্ত সারি সংখ্যা গণনা করতে চান। প্রয়োজনীয়তাটি কল্পনা করার জন্য, আপনি যদি অর্ডার সম্পর্কিত তথ্য ছাড়াও সম্পর্কিত গ্রাহকের সমস্ত আদেশের গণনাটি পৃথক কলাম হিসাবে দেখতে চান তবে আপনি বিভাগ () দ্বারা বিভাজনে বিভাজন সহ একত্রিতকরণ ফাংশনটি ব্যবহার করতে পারেন

উদাহরণ স্বরূপ,

SELECT
    SalesOrderNumber,
    CustomerId,
    COUNT(*) OVER (PARTITION BY CustomerId) CustomerOrderCount
FROM Sales.SalesOrderHeader

0

এই ক্যোয়ারী:

SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'

আপনার কাছে নেই UserNameএমন সমস্ত সারি ফিরিয়ে দেবে 'Joe'LEUserName='Joe'

সেগুলি ক্রমে তালিকাভুক্ত করা হবে UserIDএবং row_numberক্ষেত্রটি 1 এবং বর্ধনের সাথে শুরু হবে তবে অনেকগুলি সারি রয়েছেUserName='Joe'

যদি এটি আপনার পক্ষে কাজ করে না তবে আপনার WHEREকমান্ডের একটি সমস্যা আছে বা UserIDটেবিলে কোনও নেই । উভয় ক্ষেত্রের জন্য UserIDএবং UserName

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.