আমি কীভাবে ওরাকলে শীর্ষ 1 করব?


251

আমি নিম্নলিখিতটি কীভাবে করব?

select top 1 Fname from MyTbl

ইন ওরাকল 11g ?




3
আপনি 'টপ 1' চান সে অনুযায়ী আদেশটি বলতে পারেন?
অ্যান্ড্রু ওল্ফ

1
প্রথমত আপনার এটির জন্য কখনও কখনও ডিবি ইঞ্জিনের উপর নির্ভর করা উচিত নয়। আপনি যদি এই জাতীয় জিনিস জানতে চান তবে সিকোয়েন্সার রাখুন। আপনি যখন এটি করেন তবে এটি গ্যারান্টিযুক্ত যে তারা সন্নিবেশ করানো ক্রমে তাদের নম্বরযুক্ত হবে।
ফ্লাইংগুই

উত্তর:


257

আপনি যদি কেবলমাত্র প্রথম নির্বাচিত সারিটি চান তবে আপনি এটি করতে পারেন:

select fname from MyTbl where rownum = 1

অর্ডার করতে এবং শীর্ষস্থানীয় এক্স নিতে আপনি বিশ্লেষণমূলক ফাংশনও ব্যবহার করতে পারেন:

select max(fname) over (rank() order by some_factor) from MyTbl

54
আপনি যদি কেবল 1 টি সারি চান এবং কোনটি যত্নশীল না হন এটি ভাল। আপনি যদি সর্বাধিক সাম্প্রতিক রেকর্ডের মতো সুনির্দিষ্ট সারিগুলি চান, তবে আপনাকে ভ্যাশের উত্তরের মতো একটি সাব-সাবকেলে সাজতে হবে। ওরাকল বাছাইয়ের আগে রোউনউমকে নিয়োগ দেয়।
স্কট বেইলি

4
@ স্কট ইয়ুপ ঐটা ঠিক. এবং প্যাট্রিক, ভাল পয়েন্ট আমার মনে হয় সিনট্যাক্সটি এতে ভুল। এটি সত্যিই একটি কীট ওভার হওয়া উচিত (ঘন_আরঙ্ক () শেষ ...)
এমপিপিটারসন

2
প্রথম এবং দ্বিতীয় উদাহরণের মধ্যে পার্থক্য হ'ল প্রথমটি একটি সারি নির্বাচন করে (কোনও সারি, কোনও অর্ডার ছাড়াই)। দ্বিতীয় উদাহরণটি অর্ডার অভ্যন্তরীণ কোয়েরি না করেই প্রথম সারির মান পায় (নীচের উদাহরণ অনুসারে)।
জুলিউসলেট

3
সিনট্যাক্সটি সঠিক নয়: মাইটিবিএল থেকে সর্বাধিক (নামকরণ) ওভার (র‌্যাঙ্ক () অর্ডারটি কিছু_ফ্যাক্টর দ্বারা) নির্বাচন করুন
স্টাফেন গেরবার

1
@ জ্যাক্লোজানো "ওরাকলের খুব পরিচিত কার্যকারিতা নয়" - শ্রদ্ধার সাথে আমি আলাদা হতে অনুরোধ করছি। এটি গুরুত্বপূর্ণ কারণ "সুপরিচিত কার্যকারিতা" অস্পষ্টতা বোঝায় এবং তাই আমাদের ব্যবহার এড়ানো উচিত বলে পরামর্শ দিতে পারে। এটি অস্পষ্ট নয় এবং এর ব্যবহার এড়ানো উচিত নয়।
সেপ্টেস্টার

166
SELECT *
  FROM (SELECT * FROM MyTbl ORDER BY Fname )
 WHERE ROWNUM = 1;

8
এই উত্তরটি সঠিকভাবে শীর্ষ সারিতে পাবে (ROWNUM- এ সীমাবদ্ধ করার আগে ফলাফলগুলি অর্ডার করে)।
জুলিউসলেট

এই উত্তরটি হুবহু অনুবাদ নয় - মূল ক্যোয়ারিতে কোনও অর্ডার বাইরের নেই, বা এটি টেবিলের সমস্ত কলামও ফেরত দেয় না।
ওএমজি পনিস

আমি সংশোধন দাঁড়িয়ে (নীচে দেখুন)। একবার সময় পেলে ভোট স্যুইচ করবে।
জুলিউসলেট

7
@ ওএমজিপিওনিগুলি হ্যাঁ তবে এটি সম্ভবত বেশিরভাগ লোকেরা চায় যাঁরা এই সমস্যাটি
গুগল করার

4
এটি অবশ্যই এই থ্রেডের বিজয়ী উত্তর হতে হবে। আমি একটি নোট যোগ হতে পারে জন্য top Xএক তা পরিবর্তন করতে পারেনWHERE ROWNUM <= X
SomethingSomething

31

সঙ্গে ওরাকল 12C (জুন 2013), আপনি নিচের মত এটি ব্যবহার করতে পারবেন।

SELECT * FROM   MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL          
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY

6
আকর্ষণীয় কমান্ড, আমি এখানে 12 সি ব্যবহার করছি এবং OFFSET 0 ROWSস্পষ্টতই প্রয়োজন হয় না, আপনি ব্যবহার করতে পারেন FETCH NEXT 1 ROWS ONLYবা এমনকি FETCH FIRST ROW ONLY, এর ক্রমটি গুরুত্বপূর্ণ বা এটি কেবল একটি ব্যবহারের সমতুল্য হবে WHERE rownum = 1। এমনকি আমি এটি একটি আউটর অ্যাপ্লিকেশন নির্দেশেও চেষ্টা করেছি এবং এটি সেখানে Ms-SQL এর শীর্ষ ফাংশনের মতো কাজ করেছে।
রাফায়েল মেরলিন

আপনি ঠিক বলেছেন @ রাফায়েলমারলিন। আপনার পোস্টের পরে আমি স্বীকার করেছি যে অফসেট 0 রাউস প্রয়োজনীয় নয়। যখন উপরের X এবং শীর্ষ ওয়াই মধ্যে ডেটা পুনরুদ্ধারের এটা দরকারী হবে
MSK


এখন পর্যন্ত এত ভাল, একটি গুরুত্বপূর্ণ অনুপস্থিত বিন্দু যা কোনটি দিয়ে TIES। পড়ুন এই ক্ষেত্রে যখন বন্ধন সংস্করণের জন্য ঘটতে 12c +এবং12c -
Barbaros Özhan

10

আপনি সাব-কোয়েরিতে ROW_NUMBER()একটি ORDER BYধারা ব্যবহার করতে পারেন এবং প্রতিস্থাপনে এই কলামটি ব্যবহার করতে পারেন TOP N। এটি ধাপে ধাপে ব্যাখ্যা করা যেতে পারে।

নীচের টেবিলটি দেখুন যা দুটি কলাম NAMEএবং DT_CREATED

এখানে চিত্র বর্ণনা লিখুন

আপনার যদি প্রথম দুটি তারিখ নির্বিশেষে গ্রহণের প্রয়োজন হয় তবে আপনি NAMEনীচের কোয়েরিটি ব্যবহার করতে পারেন। যুক্তিটি ক্যোয়ারির ভিতরে লেখা হয়েছে

-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
    -- Generates numbers in a column in sequence in the order of date
    SELECT ROW_NUMBER() OVER (ORDER BY DT_CREATED) AS RNO,
    NAME,DT_CREATED
    FROM DEMOTOP
)TAB
WHERE RNO<3;

ফলাফল

এখানে চিত্র বর্ণনা লিখুন

কিছু পরিস্থিতিতে, আমাদের TOP Nপ্রতিটি সম্পর্কিত ফলাফল নির্বাচন করা প্রয়োজন NAME। সেক্ষেত্রে আমরা সাব-কোয়েরিতে PARTITION BYএকটি ORDER BYধারা ব্যবহার করতে পারি । নীচের প্রশ্নটি দেখুন।

-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
  --Generates numbers in a column in sequence in the order of date for each NAME
    SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DT_CREATED) AS RNO,
    NAME,DT_CREATED
    FROM DEMOTOP
)TAB
WHERE RNO<3;

ফলাফল

এখানে চিত্র বর্ণনা লিখুন


1
ROW_NUMBER () ব্যবহার করা ... বিষয় উত্তরের চেয়ে সঠিক সমাধান। এই সমাধানটির একটি সমস্যা (এবং সর্বোচ্চ (ক্ষেত্র) বৈকল্পিকের সাথেও) যে আপনি আপডেটের জন্য "নির্বাচন করুন ... (নির্বাচন করুন ROW_NUMBER () ...) এর মতো কাজ করতে পারবেন না ;"
আলেক্সো পো।

এবং এটি কখনও কখনও পিএল / এসকিউএল-তে খুব গুরুত্বপূর্ণ হয় (দুঃখিত, 5 মিনিটের সীমাতে পূর্ববর্তী মন্তব্য সম্পাদনা করতে ব্যর্থ হয়েছে)।
আলেক্সো পো।

সেক্ষেত্রে আমরা বাইরের অংশের মতো সিটিই ব্যবহার করতে পারি। রাইট? @ অ্যালেক্সো পো।
সারথ আভানাভ

আমি মনে করি আমি আপনাকে বুঝতে পারি না। আপডেটের জন্য ধারাটি যখন রাউইকআইডি "সহজেই" ওরাকল দ্বারা সংরক্ষিত থাকে তখন ব্যবহার করা যেতে পারে। সুতরাং গোষ্ঠীকরণ (এবং বিশ্লেষণাত্মক ধারা ব্যবহারের কারণে গোষ্ঠীকরণ) আসল ROWID লুকায় এবং সারিগুলি লক করা যায় না। এবং দ্বিতীয়ত, সিটিই ( with (select ... ) as ধারা) এই সমস্যায় কোনও পরিবর্তন করে না, সিটিই কেবল অনুসন্ধানগুলি পড়া এবং সমর্থন করা। রাইট? @ সরথ আভানাভু
পো।

আমার নিজের উপর নোট। ROWID এর সমস্যাটি আসলে বিশেষত ঘটে কারণ RNO <3 শর্তের কারণেই , এই ক্ষেত্রে আরএনওর মান ROWID এর সাথে সংযুক্ত নয় তাই আরাকল সারিগুলিকে লক করতে পারে না।
আলেক্সো পো।

9

আপনি যেমন কিছু করতে পারেন

    SELECT *
      FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
 WHERE rownum = 1;

আপনি বিশ্লেষণমূলক ফাংশনগুলি RANK এবং / অথবা DENSE_RANK ব্যবহার করতে পারেন তবে ROWNUM সম্ভবত সবচেয়ে সহজ।


1
আপনি কি দয়া করে র‌্যাঙ্কের কয়েকটি উদাহরণ দিয়ে সহায়তা করতে পারেন
ব্রেকফ্রিহগ


5

ব্যবহার করুন:

SELECT x.*
  FROM (SELECT fname 
          FROM MyTbl) x
 WHERE ROWNUM = 1

যদি Oracle9i + ব্যবহার করে থাকেন, আপনি ROW_NUMBER () এর মতো বিশ্লেষণমূলক ফাংশনগুলি ব্যবহার করে দেখতে পারেন তবে তারা ROWNUM এর মতো পারফর্ম করবে না


1
উত্তম উত্তর তবে একটি ছোট টাইপ রয়েছে। আপনি যেখানে Oracle9i + বলছেন তা 8i হওয়া উচিত নয়? download-west.oracle.com/docs/cd/A87860_01/doc/server.817/...
ইয়ান ছুতার

@ কার্পেন্টেরি: সত্য, বিশ্লেষণগুলি 8i তে উপলব্ধ ছিল - এর বিশদটি মনে করতে পারে না, তবে বিশ্লেষণগুলি 9 ই পর্যন্ত সত্যই জনসাধারণের কাছে উপলব্ধ ছিল না।
ওএমজি পনিস

ছোট মন্তব্য - নীচে ভ্যাশের উত্তরটিতে অন্তর্নিহিত কোয়েরিতে একটি অর্ডার অন্তর্ভুক্ত রয়েছে যা আপনি 'প্রথম' এর পরিবর্তে নামের শীর্ষস্থানীয় মানটি চান (যা সম্ভবত কোনও প্রথম সারির সন্নিবেশ করা যেতে পারে) এর চেয়ে গুরুত্বপূর্ণ। একটি সম্পাদনা মূল্যবান হতে পারে?
জুলিউসলেট

@ জুলেসলেট: ওপি কর্তৃক প্রদত্ত ক্যোয়ারিতে কোনও অর্ডার বাইরের অন্তর্ভুক্ত নেই, সুতরাং এটি উত্তর প্রতিনিধিত্ব করে এবং ওরাকল সিনট্যাক্সের সঠিক অনুবাদ।
ওএমজি পনিজ

এসকিউএল সার্ভার শীর্ষ সিনট্যাক্স সম্পর্কে আমার ভুল বোঝাবুঝি (ভ্রান্তভাবে অনুমান করা হয়েছে যে এটি র‌্যাঙ্কে প্রথম সারির মতো, ROWNUM নয়)। ভোট দিয়েছেন।
জুলিউসলেট

3

কোনও টেবিল থেকে প্রথম সারিটি নির্বাচন করা এবং টেবিল থেকে একটি সারি নির্বাচন করা দুটি পৃথক কাজ এবং একটি পৃথক কোয়েরি প্রয়োজন। এটি করার অনেকগুলি সম্ভাব্য উপায় রয়েছে। এর মধ্যে চারটি হ'ল:

প্রথম

select  max(Fname) from MyTbl;

দ্বিতীয়

select  min(Fname) from MyTbl;

তৃতীয়

select  Fname from MyTbl  where rownum = 1;

চতুর্থ

select  max(Fname) from MyTbl where rowid=(select  max(rowid) from MyTbl)

3

আমার একই সমস্যা ছিল এবং আমি এই সমাধান দিয়ে এটি ঠিক করতে পারি:

select a.*, rownum 
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1

শীর্ষে প্রথম মান রাখার আগে আপনি নিজের ফলাফলটি অর্ডার করতে পারেন।

শুভকামনা

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