আমি পোস্টগ্রিস টেবিলের সাথে কাজ করছি (যাকে "লাইভ" বলা হয়) এতে টাইম_স্ট্যাম্প, ইউএসআরআইডি, লেনদেন_আইড, এবং লাইফসাইডিংয়ের জন্য কলাম সহ রেকর্ড রয়েছে। আমার কাছে এমন একটি কোয়েরি দরকার যা প্রতিটি usr_id এর জন্য আমাকে সর্বশেষতম জীবন_সামরণ দেবে
- একাধিক ব্যবহারকারী রয়েছে (স্বতন্ত্র ইউএস_আইডি)
- টাইম_স্ট্যাম্প কোনও অনন্য শনাক্তকারী নয়: কখনও কখনও ব্যবহারকারীর ইভেন্টগুলি (টেবিলের এক এক সারি) একই সময়_স্ট্যাম্পের সাথে ঘটে।
- trans_id কেবলমাত্র খুব অল্প সময়ের জন্যই অনন্য: সময়ের সাথে সাথে এটি পুনরাবৃত্তি করে
- অবশিষ্ট_লাইভগুলি (প্রদত্ত ব্যবহারকারীর জন্য) সময়ের সাথে সাথে উভয়ই বৃদ্ধি বা হ্রাস করতে পারে
উদাহরণ:
সময়_স্ট্যাম্প | জীবন_সামরণ | usr_id | ট্রান্সআইড _ ----------------------------------------- 07:00 | 1 | 1 | ঘ 09:00 | 4 | 2 | ঘ 10:00 | 2 | 3 | ঘ 10:00 | 1 | 2 | ঘ 11:00 | 4 | 1 | 5 11:00 | 3 | 1 | । 13:00 | 3 | 3 | ঘ
যেহেতু প্রতিটি দেওয়া usr_id এর সর্বশেষতম ডেটা সহ আমার সারিটির অন্যান্য কলামগুলি অ্যাক্সেস করতে হবে, আমার একটি ক্যোয়ারী দরকার যা এর ফলাফল দেয়:
সময়_স্ট্যাম্প | জীবন_সামরণ | usr_id | ট্রান্সআইড _ ----------------------------------------- 11:00 | 3 | 1 | । 10:00 | 1 | 2 | ঘ 13:00 | 3 | 3 | ঘ
যেমনটি উল্লেখ করা হয়েছে, প্রতিটি usr_id জীবন অর্জন করতে বা হারাতে পারে এবং কখনও কখনও এই টাইমস্ট্যাম্পড ইভেন্টগুলি এতটা একসাথে ঘটে থাকে যে তাদের একই টাইমস্ট্যাম্প রয়েছে! সুতরাং এই কোয়েরিটি কাজ করবে না:
SELECT b.time_stamp,b.lives_remaining,b.usr_id,b.trans_id FROM
(SELECT usr_id, max(time_stamp) AS max_timestamp
FROM lives GROUP BY usr_id ORDER BY usr_id) a
JOIN lives b ON a.max_timestamp = b.time_stamp
পরিবর্তে, সঠিক সারিটি সনাক্ত করতে আমাকে টাইমস্ট্যাম্প (প্রথম) এবং ট্রান্সআইড (দ্বিতীয়) উভয়ই ব্যবহার করতে হবে। তারপরে আমাকে সাব-কোয়েরি থেকে মূল ক্যোয়ারিতে সেই তথ্যটি পাঠাতে হবে যা উপযুক্ত সারিগুলির অন্যান্য কলামগুলির জন্য ডেটা সরবরাহ করবে। এটি হ্যাক আপ ক্যোয়ারী যা আমি কাজ করতে পেরেছি:
SELECT b.time_stamp,b.lives_remaining,b.usr_id,b.trans_id FROM
(SELECT usr_id, max(time_stamp || '*' || trans_id)
AS max_timestamp_transid
FROM lives GROUP BY usr_id ORDER BY usr_id) a
JOIN lives b ON a.max_timestamp_transid = b.time_stamp || '*' || b.trans_id
ORDER BY b.usr_id
ঠিক আছে, সুতরাং এটি কাজ করে, তবে আমি এটি পছন্দ করি না। এটির জন্য একটি ক্যোয়ারির মধ্যে একটি কোয়েরি প্রয়োজন, একটি স্ব-যোগদান করুন এবং এটি আমার কাছে মনে হয় যে ম্যাক্স সর্বাধিক টাইমস্ট্যাম্প এবং ট্রান্স_আইডি পেয়েছে এমন সারিটি ধরে ফেললে এটি আরও সহজ হতে পারে। "জীবন" সারণিতে কয়েক মিলিয়ন সারি পার্স করার জন্য রয়েছে, তাই আমি চাইব যে এই ক্যোয়ারীটি যত দ্রুত সম্ভব এবং তত দ্রুত কার্যকর হোক। আমি আরডিবিএম এবং বিশেষত পোস্টগ্র্রেসে নতুন, তাই আমি জানি যে আমাকে সঠিক সূচকগুলির কার্যকর ব্যবহার করা দরকার। আমি কীভাবে অপ্টিমাইজ করব সে সম্পর্কে আমি কিছুটা হারিয়েছি।
আমি একটি অনুরূপ আলোচনা পাওয়া এখানে । আমি কি ওরাকল বিশ্লেষণমূলক ফাংশনের সমতুল্য কিছু ধরণের পোস্টগ্রিস সম্পাদন করতে পারি?
একটি সামগ্রিক ফাংশন (ম্যাক্সের মতো) দ্বারা ব্যবহৃত কলাম সম্পর্কিত তথ্য অ্যাক্সেস, সূচী তৈরি এবং আরও ভাল প্রশ্ন তৈরির বিষয়ে যে কোনও পরামর্শই প্রশংসিত হবে!
পিএস আপনি আমার উদাহরণ কেস তৈরি করতে নিম্নলিখিত ব্যবহার করতে পারেন:
create TABLE lives (time_stamp timestamp, lives_remaining integer,
usr_id integer, trans_id integer);
insert into lives values ('2000-01-01 07:00', 1, 1, 1);
insert into lives values ('2000-01-01 09:00', 4, 2, 2);
insert into lives values ('2000-01-01 10:00', 2, 3, 3);
insert into lives values ('2000-01-01 10:00', 1, 2, 4);
insert into lives values ('2000-01-01 11:00', 4, 1, 5);
insert into lives values ('2000-01-01 11:00', 3, 1, 6);
insert into lives values ('2000-01-01 13:00', 3, 3, 1);