পোস্টগ্রিসক্লিতে শীর্ষ 10 মান কীভাবে পাবেন?


256

আমার সহজ প্রশ্ন:

আমি একটি আছে postgresqlডাটাবেসের: Scores(score integer)

আমি কীভাবে দ্রুততম 10 টি স্কোর পাব?

হালনাগাদ:

আমি এই ক্যোয়ারীটি একাধিকবার করব এবং দ্রুত সমাধানের লক্ষ্যে নিচ্ছি।


6
-1: এতক্ষণ আপনি কী করেছেন? কেন যে যথেষ্ট ভাল না? পোস্টগ্র্যাস সংস্করণটি কী? কোথায় আছে explain analyze?
mys

উত্তর:


372

এই জন্য আপনি সীমা ব্যবহার করতে পারেন

select *
from scores
order by score desc
limit 10

যদি পারফরম্যান্স গুরুত্বপূর্ণ হয় (কখন তা হয় না ;-) স্কোরের সূচকের সন্ধান করুন।


8.4 সংস্করণ দিয়ে শুরু করে, আপনি স্ট্যান্ডার্ড ( এসকিউএল: ২০০৮ ) ব্যবহার করতে পারেনfetch first

select *
from scores
order by score desc
fetch first 10 rows only

@ রাফভান্স যেমন উল্লেখ করেছেন, এটি আপনাকে first 10 rowsআক্ষরিক অর্থে দেবে। সদৃশ মানগুলি সরাতে আপনাকে distinctসারিগুলি নির্বাচন করতে হবে , যেমন

select distinct *
from scores
order by score desc
fetch first 10 rows only

এসকিউএল ফিডল


2
fetch first X rows onlyআমি যে উত্তরটি খুঁজছিলাম তা হ'ল - সুদূর ভবিষ্যতে আপনাকে ধন্যবাদ!
ভর ডট নেট

35

মনে হয় আপনি খুঁজছেন ORDER BYমধ্যে DESCদিয়ে শেষ হওয়া অর্ডার LIMIT টি দফা:

SELECT
 *
FROM
  scores
ORDER BY score DESC
LIMIT 10

অবশ্যই SELECT *কর্মক্ষমতা গুরুতরভাবে প্রভাবিত করতে পারে, তাই সতর্কতার সাথে এটি ব্যবহার করুন।


3

মনে রাখবেন যে শীর্ষ 10 মানগুলিতে যদি সম্পর্ক থাকে তবে আপনি কেবলমাত্র শীর্ষ 10 সারি পাবেন, উত্তরগুলি দিয়ে দেওয়া শীর্ষ 10 মানগুলি পাবেন না । উদাহরণস্বরূপ: যদি শীর্ষ 5 মান 10, 11, 12, 13, 14, 15 হয় তবে আপনার ডেটা 10, 10, 11, 12, 13, 14, 15 ধারণ করে আপনি কেবল 10, 10, 11, 12, 13 পাবেন, আপনার শীর্ষ 5 হিসাবে এLIMIT

এখানে একটি সমাধান রয়েছে যা বন্ধনগুলি থাকলে 10 টিরও বেশি সারি ফিরে আসবে তবে আপনি সমস্ত সারি পাবেন যেখানে some_value_columnপ্রযুক্তিগতভাবে শীর্ষ 10 এ রয়েছে।

select
  *
from
  (select
     *,
     rank() over (order by some_value_column desc) as my_rank
  from mytable) subquery
where my_rank <= 10

তার প্রশ্ন থেকে টেবিলে একটি কলাম রয়েছে। তাহলে কেন "স্কোর ডেস্ক সীমা 10 দ্বারা স্কোর অর্ডার থেকে আলাদা স্কোর নির্বাচন করবেন না"?
ডেরেক

@ ডেরেক, ভালো কথা। যদিও এটি সম্ভবত কোনও বাস্তব বিশ্বের অ্যাপ্লিকেশনটির ক্ষেত্রে না ঘটে যেখানে আমরা সাধারণত "কিছু কিছু" শীর্ষস্থানীয় এন সনাক্ত করতে চাইছি।
রাফভানস

সত্য। শুধু তার সঠিক প্রশ্নের উপর ফোকাস। এছাড়াও, আপনার মতো সাবকোয়ারিতে সীমা ব্যবহার করে আমার ভাগ্য ভাল হয়েছে, যেমন "টেবিল থেকে নির্বাচন করুন * যেখানে মান (টেবিল ক্রম থেকে পৃথক মান নির্বাচন করুন মান 10 সীমা 10)" আমি মনে করি এটি আপনার সমতুল্য। আমি নিশ্চিত না যে আমাদের কোয়েরিতে কোনটি আরও ভাল পারফর্ম করবে, সম্ভবত এটি টেবিলের কাঠামো এবং সূচকের উপর নির্ভর করবে।
ডেরেক

র্যাঙ্কের পরেও
ওভারের

2
(SELECT <some columns>
FROM mytable
<maybe some joins here>
WHERE <various conditions>
ORDER BY date DESC
LIMIT 10)

UNION ALL

(SELECT <some columns>
FROM mytable
<maybe some joins here>
WHERE <various conditions>
ORDER BY date ASC    
LIMIT 10)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.