ওরাকল শীর্ষ 10 রেকর্ড নির্বাচন করুন


144

ওরাকলে একটি এসকিউএল স্টেটমেন্ট নিয়ে আমার একটি বড় সমস্যা আছে। আমি STORAGE_DB দ্বারা অর্ডার করা শীর্ষ 10 টি রেকর্ড নির্বাচন করতে চাই যা অন্য নির্বাচনী বিবৃতি থেকে তালিকায় নেই।

এটি সমস্ত রেকর্ডের জন্য দুর্দান্ত কাজ করে:

SELECT DISTINCT 
  APP_ID, 
  NAME, 
  STORAGE_GB, 
  HISTORY_CREATED, 
  TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE  
  FROM HISTORY WHERE 
      STORAGE_GB IS NOT NULL AND 
        APP_ID NOT IN (SELECT APP_ID
                       FROM HISTORY
                        WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') 

তবে আমি যখন যুক্ত করছি

AND ROWNUM <= 10
ORDER BY STORAGE_GB DESC

আমি একরকম "এলোমেলো" রেকর্ডস পাচ্ছি। আমি মনে করি কারণ আদেশের আগে সীমাটি জায়গা করে নেয়।

কারও কি ভাল সমাধান আছে? অন্যান্য সমস্যা: এই ক্যোয়ারীটি সত্যই ধীর (10 কে + রেকর্ড)


সম্ভাব্য সদৃশ: স্ট্যাকওভারফ্লো.com
এপিসি

উত্তর:


199

আপনাকে আপনার বর্তমান ক্যোয়ারীটি নীচে সাবকোয়ারিতে রাখতে হবে:

SELECT * FROM (
  SELECT DISTINCT 
  APP_ID, 
  NAME, 
  STORAGE_GB, 
  HISTORY_CREATED, 
  TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE  
  FROM HISTORY WHERE 
    STORAGE_GB IS NOT NULL AND 
      APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009')
  ORDER BY STORAGE_GB DESC )
WHERE ROWNUM <= 10

ওরাকল ফলাফলটি ফেরত দেওয়ার পরে rownum প্রয়োগ করে ।
ফলাফলটি ফিরিয়ে দেওয়ার পরে আপনাকে ফিল্টার করতে হবে, সুতরাং সাবকিউরি প্রয়োজন। টপ-এন ফলাফল পেতে আপনি RANK () ফাংশনটিও ব্যবহার করতে পারেন ।

পারফরম্যান্সের জন্য NOT EXISTSজায়গায় ব্যবহার করার চেষ্টা করুন NOT IN। দেখুন এই আরো অনেক কিছুর জন্য।


নন অস্টিস্টস এই দৃশ্যে কাজ করছে না (অবৈধ রিলেশনাল অপারেটর) অ্যাপ্লিকেশন_অনুপাত নেই (SELEC ...)
opHASnoNAME

3
কেউ কেউ বলতে পারেন যে এটি লোককে ওরাকলে পরিণত করার পক্ষে উপযুক্ত।
মিঃবোজ্যাংলেস

2
FETCH NEXT N ROWS ONLYনীচে উত্তর চেক করুন ।
মোহনিশ

@ পদ্মারাগ: যখন কোনও কোউনটিতে কোনও রোউনাম প্রযোজ্য হয় তখন - সামট্যাবল থেকে * নির্বাচন করুন যেখানে কিছু কলম = '123' এবং রোউনাম <= 3। এটি কি [সামিটবেল থেকে কিছু নির্বাচন করুন যেখানে কিছু কলম = '123'] থেকে ফলাফলগুলি নির্বাচনের পরে রয়েছে
শিরগিল ফারহান

55

আপনি যদি ওরাকল 12 সি ব্যবহার করেন তবে ব্যবহার করুন:

আনা পরবর্তী এন ROWS টি কেবলমাত্র

SELECT DISTINCT 
  APP_ID, 
  NAME, 
  STORAGE_GB, 
  HISTORY_CREATED, 
  TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE  
  FROM HISTORY WHERE 
    STORAGE_GB IS NOT NULL AND 
      APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009')
  ORDER BY STORAGE_GB DESC
FETCH NEXT 10 ROWS ONLY

আরও তথ্য: http://docs.oracle.com/javadb/10.5.3.0/ref/rrefsqljoffsetfetch.html


2
এটি অন্যান্য উত্তরের সাথে তুলনা করে সোনার
aswzen


1
আমি এই উত্তরটি 100 টি upvotes দিতে চাই! তবে হায়, আমার পুরষ্কারের একটাই আছে। একটাই!
এডাইলন

23

দুর্বল পারফরম্যান্সের সাথে সম্পর্কিত যে কোনও বিষয় হতে পারে এবং এটি একটি পৃথক প্রশ্ন হওয়া উচিত। তবে, একটি স্পষ্ট বিষয় আছে যা একটি সমস্যা হতে পারে:

WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') 

যদি HISTORY_DATE সত্যিই একটি তারিখ কলাম হয় এবং যদি এটির একটি সূচক থাকে তবে এই পুনর্লিখনটি আরও ভাল সম্পাদন করবে:

WHERE HISTORY_DATE = TO_DATE ('06.02.2009', 'DD.MM.YYYY')  

এটি কারণ একটি ডেটাটাইপ রূপান্তর একটি বি-ট্রি সূচক ব্যবহার অক্ষম করে।



11

আপনি একটি আপাতদৃষ্টিতে এলোমেলো সেট পেয়ে যান কারণ অর্ডারের বাইরের আগে ROWNUM প্রয়োগ করা হয়। সুতরাং আপনার ক্যোয়ারিতে প্রথম দশটি সারি নেওয়া হয় এবং সেগুলি সাজানো হয় the শীর্ষ দশটি বেতন নির্বাচন করার জন্য আপনাকে একটি সাবকোয়রিতে বিশ্লেষণমূলক ফাংশন ব্যবহার করা উচিত, তারপরে এটি ফিল্টার করুন:

 select * from 
     (select empno,
             ename,
             sal,
             row_number() over(order by sal desc nulls last) rnm
    from emp) 
 where rnm<=10
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.