পোস্টগ্রিজ: আলাদা তবে কেবল একটি কলামের জন্য


120

আমার নামগুলির সাথে pgsql এ একটি টেবিল রয়েছে (1 টিরও বেশি মিয়ো। সারি রয়েছে) তবে আমার আরও অনেকগুলি নকল রয়েছে। আমি 3 ক্ষেত্র নির্বাচন করুন: id,name , metadata

আমি তাদের সঙ্গে এলোমেলোভাবে নির্বাচন করতে চান ORDER BY RANDOM()এবংLIMIT 1000 তাই আমার পিএইচপি স্ক্রিপ্টে কিছু স্মৃতি সঞ্চয় করার জন্য এটি অনেক ধাপ।

তবে আমি কীভাবে এটি করতে পারি তাই এটি কেবল আমাকে তালিকাতে দেয় যাতে কোনও নাম নেই uplic

উদাহরণস্বরূপ [1,"Michael Fox","2003-03-03,34,M,4545"]ফিরে আসবে তবে হবে না [2,"Michael Fox","1989-02-23,M,5633"]। নাম ক্ষেত্রটি সর্বাধিক গুরুত্বপূর্ণ এবং আমি যখনই নির্বাচনটি করি তা তালিকার মধ্যে অবশ্যই অনন্য হওয়া উচিত এবং এটি অবশ্যই এলোমেলো হতে পারে।

আমি চেষ্টা করেছিলাম GROUP BY name, তবে তারপরেও আমি আইডি এবং মেটাডেটা GROUP BYপাশাপাশি বা একটি অবিচ্ছিন্ন ফাংশনে রাখব বলে আশা করি তবে আমি সেগুলি কোনওভাবেই ফিল্টার করতে চাই না।

যে কেউ কীভাবে অনেকগুলি কলামগুলি আনতে জানেন তবে কেবল একটি কলামে আলাদা করা যায়?

উত্তর:


225

শুধুমাত্র একটি (বা এন) কলাম (গুলি) এ আলাদা করতে:

select distinct on (name)
    name, col1, col2
from names

এটি নাম সম্বলিত যে কোনও সারিকে ফেরত দেবে। আপনি যদি সারিগুলির মধ্যে কোনটি ফিরে আসবেন তা নিয়ন্ত্রণ করতে চান তবে আপনাকে অর্ডার করতে হবে:

select distinct on (name)
    name, col1, col2
from names
order by name, col1

কল 1 দ্বারা অর্ডার করা হলে প্রথম সারিতে ফিরে আসবে।

distinct on:

ডিস্টিন্ট অন অন (এক্সপ্রেশন [, ...]) প্রতিটি সারির প্রথম সেটটিকে রেখে দেয় যেখানে প্রদত্ত প্রকাশগুলি সমান হিসাবে মূল্যায়ন করে। অর্ডার বাই (একই সাথে উপরে) হিসাবে একই বিধিগুলি ব্যবহার করে DISTINCT অন এক্সপ্রেশনগুলি ব্যাখ্যা করা হয়। নোট করুন যে কাঙ্ক্ষিত সারিটি প্রথমে উপস্থিত রয়েছে তা নিশ্চিত করতে অর্ডার বাই ব্যবহার না করা হলে প্রতিটি সেটের "প্রথম সারি" অনির্দেশ্য।

DISTINCT অন এক্সপ্রেশন (গুলি) অবশ্যই বাম দিকের অর্ডার বাই এক্সপ্রেশন (গুলি) এর সাথে মেলে। অর্ডার বাই ক্লজটিতে সাধারণত অতিরিক্ত প্রকাশ (গুলি) থাকে যা প্রতিটি DISTINCT অন গ্রুপের মধ্যে সারিগুলির পছন্দসই নজির নির্ধারণ করে।


অর্ডার দেওয়ার জন্য ভাল ধরা। আমি এটিকে অন্তর্ভুক্ত করি নি কারণ তারা এলোমেলো ক্রম অর্ডার করার কথা উল্লেখ করেছে, তবে যাইহোক এটি উল্লেখ করা জরুরী।
ক্রেগ রিঞ্জার

হয় order by nameপ্রয়োজনীয়? এটি দিয়ে order by col1কি অন্যরকম ফলাফল তৈরি হবে ?
এলিওট চান্স

1
@ ইলিয়ট হ্যাঁ nameপ্রয়োজনীয় পরীক্ষা করে দেখুন distinct onম্যানুয়াল করেন।
ক্লোডোয়াল্ডো নেটো

1
আমি আশা করি টিএসকিউএল দল এটি করার মতো বুদ্ধিমান উপায় সরবরাহ করতে পারে।
JTW

দয়া করে যথাযথ
পোস্টগ্র্যাস্কল

17

যে কেউ কীভাবে অনেকগুলি কলামগুলি আনতে জানেন তবে কেবল একটি কলামে আলাদা করা যায়?

আপনি এই DISTINCT ONধারাটি চান ।

আপনি নমুনা ডেটা বা একটি সম্পূর্ণ কোয়েরি সরবরাহ করেন নি তাই আপনাকে দেখানোর মতো কিছু আমার কাছে নেই। আপনি যেমন কিছু লিখতে চান:

SELECT DISTINCT ON (name) fields, id, name, metadata FROM the_table;

এটি প্রত্যাশিত (তবে "এলোমেলো" নয়) সারিগুলির সেটটি ফিরিয়ে দেবে। আপনি যদি অনুমানযোগ্য করে তুলতে চান তবে ORDER BYক্লোডাল্ডোর উত্তর অনুসারে একটি যুক্ত করুন । আপনি যদি এটিকে সত্যই এলোমেলো করতে চান তবে আপনি চাইবেন ORDER BY random()


কেবলমাত্র এই ডিস্টাইন্ট অন ক্লজটিতে নোট করুন, আপনি কেবল একই জিনিসটি + আরও অর্ডার করতে পারবেন। সুতরাং আপনি যদি DISTINCT অন (নাম) বলেন তবে আপনাকে অবশ্যই নামটি অর্ডার করতে হবে তবে যা কিছু আপনি চান। খুব কমই আদর্শ।
কেভিন পার্কার

কেভিন, আপনি কেবলমাত্র বাইরের ক্যোয়ারিতে একটি সিটিই বা সাব-ইন-ইন-ফ্রেম এবং অর্ডার ব্যবহার করতে পারেন
ক্রেগ রিঞ্জার

হ্যাঁ, এবং অভিনয়টি দেখুন ... সূচী স্থান থেকে সম্পূর্ণ সম্ভাব্য ফলাফলগুলি অনুসন্ধান করা হবে। এটি ডান সূচকে ১০০-২০০ মাইলের ক্যোয়ারী কী হতে পারে তা 900 ম্যাক্সের মধ্যে রূপান্তরিত করে কারণ পোস্টগ্র্রেস কোনও আলাদা স্বতন্ত্র / ক্রম পরিচালনা করতে পারে না। বাহ্যিক ক্যোয়ারী অর্ডার কী তা বিবেচনাধীন নয়, এটি প্রথম ম্যাচগুলি খুঁজে বের করার জন্য অভ্যন্তরীণ সাব-কোয়েরি থেকে সূচকটি ব্যবহার করছে, তারপরে পুনরায় সাজান। আমাদের সমস্যাগুলির সত্যিকারের সমাধানের জন্য dba.stackexchange.com/questions/260852/…
কেভিন পার্কার

4
SELECT NAME,MAX(ID) as ID,MAX(METADATA) as METADATA 
from SOMETABLE
GROUP BY NAME

2
কেবলমাত্র সাবধানতার একটি শব্দ: এটি আইডি মান বা মেটাডেটা মানটি "একসাথে" ফিরিয়ে দিতে পারে না
a_horse_with_no_name

@ নোভম নং। এর অর্থ মাইকেল এর সর্বাধিক অক্ষরের জন্য জিজ্ঞাসা করা হওয়ায় এটি বিড়াল মাইকেল এর সারিগুলির একটির থেকে একটি আইডি মান এবং অন্যটির থেকে মেটাডেটা নেয়।
ক্লোডোলোডো নেট

হ্যাঁ, এটি ওপি ব্যবহারের বাস্তব ডেটাগুলির উপর নির্ভর করে, যা আমি একেবারেই অজ্ঞ। আপনার এমআইএন বা যা কিছু ব্যবহার করার প্রয়োজন হতে পারে। কেবল প্রদর্শিত হয়েছে, কীভাবে আপনি ক্ষেত্রগুলি কোনও GROUP BYশর্তে অন্তর্ভুক্ত করতে পারবেন না ।
ডেভিড জশি

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