কীভাবে একটি কলাম এবং অন্য কলামে যে কোনও পৃথক নির্বাচন করতে?


29

একটি কলামের সমস্ত স্বতন্ত্র মান খুঁজতে আমার একটি এসকিউএল ডাটাবেসটি জিজ্ঞাসা করতে হবে এবং অন্য কলাম থেকে আমার একটি নির্বিচার মান দরকার। উদাহরণস্বরূপ, দুটি কলাম, কী এবং মান সহ নিম্নলিখিত টেবিলটি বিবেচনা করুন:

key     value
===     =====
one     test
one     another
one     value
two     goes
two     here
two     also
three   example

আমি প্রতিটি স্বতন্ত্র কী থেকে নির্বিচারে বেছে নেওয়া একটি নমুনা সারি ফিরে পেতে চাই, সম্ভবত এই তিনটি সারি পেয়েছি:

key     value
===     =====
one     test
two     goes
three   example

আমি কীভাবে এসকিউএল এ জাতীয় প্রশ্ন তৈরি করতে পারি?


2
কোন ডিবিএমএস (ওরাকল, এসকিউএল-সার্ভার, ডিবি 2, মাইএসকিউএল, পোস্টগ্রিস)?
ypercubeᵀᴹ

1
এটি একটি স্বত্বাধিকারী ব্যবস্থা।
উইলিয়াম কেএফ

উত্তর:


33

লেখার সবচেয়ে সহজ ক্যোয়ারী হ'ল মাইএসকিউএল (কঠোর এএনএসআই সেটিংস সহ নয়)। এটি অ-মানক নির্মাণ ব্যবহার করে:

SELECT key, value
FROM tableX
GROUP BY key ;

সাম্প্রতিক সংস্করণে (5.7 এবং 8.0+) যেখানে কঠোর সেটিংস এবং ONLY_FULL_GROUP_BYডিফল্ট, আপনি ANY_VALUE()ফাংশনটি ব্যবহার করতে পারেন , 5.7-এ যুক্ত করেছেন:

SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;

অন্যান্য ডিবিএমএস-এর জন্য, যেগুলির উইন্ডো ফাংশন রয়েছে (যেমন পোস্টগ্রিস, এসকিউএল-সার্ভার, ওরাকল, ডিবি 2), আপনি তাদের এটি ব্যবহার করতে পারেন। সুবিধাটি হ'ল আপনি ফলাফলের অন্যান্য কলামও নির্বাচন করতে পারেন (পাশাপাশি keyএবং value):

SELECT key, value
FROM tableX
    ( SELECT key, value,
             ROW_NUMBER() OVER (PARTITION BY key 
                                ORDER BY whatever)     --- ORDER BY NULL
               AS rn                                   --- for example
      FROM tableX
    ) tmp 
WHERE rn = 1 ;

উপরের পুরানো সংস্করণগুলির জন্য এবং অন্য কোনও ডিবিএমএসের জন্য, একটি সাধারণ উপায় যা প্রায় সর্বত্র কাজ করে। একটি অসুবিধা হ'ল আপনি এই পদ্ধতির সাহায্যে অন্যান্য কলামগুলি নির্বাচন করতে পারবেন না। আর একটি হ'ল কিছু ডিবিএমএসে (যেমন বিট, পাঠ্য, ব্লবস) কিছু ডেটাটাইপগুলির মতো সামগ্রিক ফাংশনগুলি কাজ করে MIN()এবং MAX()কাজ করে না:

SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;

PostgreSQL এর একটি বিশেষ অ-মানক DISTINCT ONঅপারেটর রয়েছে যা ব্যবহার করা যায়। ঐচ্ছিক ORDER BYনির্বাচন যা প্রতি গ্রুপ থেকে সারি নির্বাচন করতে হবে জন্য:

SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;

2
ORDER BY whatever@ উইলিয়াম কেএফ যদি "নির্বিচারে বাছাই করা" এর অর্থ যদি আপনি "এলোমেলোভাবে বেছে নেওয়া" বোঝায়, তবে ফলাফলগুলি এলোমেলো করার জন্য কোনও ফাংশনে একটি কল দিয়ে কেবল ইয়ারকিউবের কোয়েরিটি প্রতিস্থাপন করুন ।
লেইফ রিফেল

1
@ লাইগ্রিফেল এটি প্রথম এলোমেলোভাবে কাজ করার মতো সহজ, কোনও পছন্দ, এলোমেলো হওয়ার দরকার নেই।
উইলিয়াম কেএফ

3

এমএস-এসকিউএল সার্ভারের জন্য:

;with FinalDataset as
(
    select *,
        row_number() over(partition by key order by value) as rownum
    from YourOriginalTable
)
select
   key,
   value
from FinalDataset 
where rownum = 1

তেমনি, আপনার দ্বিতীয় ফলাফলের সেটের জন্য আপনি রোউনাম = 2 থাকতে পারেন


2

গৃহীত উত্তরের মতো, তবে কমপক্ষে () বা সর্বোচ্চ () এর পরিবর্তে আপনি অ্যারে_এজিজি () ব্যবহার করতে পারেন

SELECT key, (array_agg(value))[1] AS value
FROM tableX
GROUP BY key ;

আপনি biggestচ্ছিকভাবে সেগুলির মধ্যে বৃহত্তম বা ক্ষুদ্রতম নির্বাচন করতে অ্যারের অভ্যন্তরে মানগুলি অর্ডার করতে পারেন:

SELECT key, (array_agg(value) ORDER BY value DESC)[1] AS value
FROM tableX
GROUP BY key ;

(পোস্টগ্র্যাস এসকিউএলএ পরীক্ষিত)

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