PostgreSQL এ বিভাগ অনুসারে সর্বোচ্চ তারিখের গ্রুপ সহ আইডি কীভাবে নির্বাচন করবেন?


91

উদাহরণস্বরূপ, আমি বিভাগ অনুসারে সর্বোচ্চ তারিখের গোষ্ঠী সহ আইডি নির্বাচন করতে চাই, ফলাফলটি: 7, 2, 6

id  category  date
1   a         2013-01-01
2   b         2013-01-03
3   c         2013-01-02
4   a         2013-01-02
5   b         2013-01-02
6   c         2013-01-03
7   a         2013-01-03
8   b         2013-01-01
9   c         2013-01-01

পোস্টগ্র্রেএসকিউএল এ কীভাবে করব তা আমি জানতে পারি?


4
পোস্টগ্র্রেএসকিউএল এর সংস্করণ অন্তর্ভুক্ত করা সর্বদা বুদ্ধিমানের কাজ।
— এরউইন ব্র্যান্ডসেটেটার

উত্তর:


145

এটি এর জন্য নিখুঁত ব্যবহারের ক্ষেত্রে DISTINCT ON- স্ট্যান্ডার্ডটির নির্দিষ্ট প্রসারকে পোস্টগ্রিজ করে DISTINCT:

SELECT DISTINCT ON (category)
       id  -- , category, date  -- any other column (expression) from the same row
FROM   tbl
ORDER  BY category, date DESC;

ক্রমবর্ধমান সাজানোর ক্রম সহ যত্নশীল। যদি কলামটি নুল হতে পারে তবে আপনি যুক্ত করতে পারেন NULLS LAST:

DISTINCT ONসহজ এবং দ্রুত। এই সম্পর্কিত উত্তরের বিস্তারিত ব্যাখ্যা:

অনেকগুলি সারি সহ বড় টেবিলগুলির জন্য categoryবিকল্প পদ্ধতির বিবেচনা করুন:


দুর্দান্ত মনে হচ্ছে তবে আপনি কি প্রতিবারই এই কাজটি করার নিশ্চয়তা পেয়েছেন?
— এথেরিয়ন

@ টিক্সেল: একেবারে। আরও তথ্যের জন্য লিঙ্কগুলি অনুসরণ করুন।
— এরউইন ব্র্যান্ডসেটেটার

21

আর একবার চেষ্টা কর:

SELECT t1.* FROM Table1 t1
JOIN 
(
   SELECT category, MAX(date) AS MAXDATE
   FROM Table1
   GROUP BY category
) t2
ON T1.category = t2.category
AND t1.date = t2.MAXDATE

এই এসকিউএলফিডলটি দেখুন


4
র‌্যাঙ্ক () উইন্ডো ফাংশনটি ব্যবহার করে অন্য বিকল্প রয়েছে।
— ডেনিস ডি বার্নার্ডি

@ ব্যবহারকারী 1735921: আপনি টেবিল 1 থেকে সমস্ত কলাম পাবেন। আপনি যা চান তা চয়ন করতে পারেন।
— হিমাংশু জনসারি

16

আরেকটি পদ্ধতি হ'ল first_valueউইন্ডো ফাংশনটি ব্যবহার করা : http://sqlfiddle.com/#!12/7a145/14

SELECT DISTINCT
  first_value("id") OVER (PARTITION BY "category" ORDER BY "date" DESC) 
FROM Table1
ORDER BY 1;

... যদিও আমি সন্দেহ করি যে hes056 এর পরামর্শ সাধারণত যথাযথ সূচকগুলি উপস্থিত রয়েছে সেখানে আরও ভাল সম্পাদন করবে।

তৃতীয় সমাধানটি হ'ল:

SELECT
  id
FROM (
  SELECT
    id,
    row_number() OVER (PARTITION BY "category" ORDER BY "date" DESC) AS rownum
  FROM Table1
) x
WHERE rownum = 1;

-5

বিড়াল ম্যাক্সের মাধ্যমে টিবিএল গ্রুপ থেকে আইডি নির্বাচন করুন (তারিখ)


4
এটি অবৈধ বাক্য গঠন এবং প্রশ্নের উত্তর না দেওয়া।
— এরউইন ব্র্যান্ডসেটেটার

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