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.