আপনার বিবরণটির ফলাফলটি একটি সারণী সংজ্ঞায় এর ফলস্বরূপ :
CREATE TABLE tbl (
lap_id serial PRIMARY KEY
, lap_no int NOT NULL
, car_type enum NOT NULL
, race_id int NOT NULL -- REFERENCES ...
, UNIQUE(race_id, car_type, lap_no)
);
এই শ্রেণীর সমস্যার সাধারণ সমাধান
দীর্ঘতম ক্রম পেতে (1 টি ফলাফল, সর্বোপরি সর্বাধিক, সম্পর্কগুলি থাকলে স্বেচ্ছাসেবী চয়ন করুন):
SELECT race_id, car_type, count(*) AS seq_len
FROM (
SELECT *, count(*) FILTER (WHERE step)
OVER (ORDER BY race_id, car_type, lap_no) AS grp
FROM (
SELECT *, (lag(lap_no) OVER (PARTITION BY race_id, car_type ORDER BY lap_no) + 1)
IS DISTINCT FROM lap_no AS step
FROM tbl
) x
) y
GROUP BY race_id, car_type, grp
ORDER BY seq_len DESC
LIMIT 1;
count(*) FILTER (WHERE step)
কেবল গণনা করা হয় TRUE
(= পরবর্তী গ্রুপে পদক্ষেপ), যার ফলশ্রুতি প্রতিটি নতুন গোষ্ঠীর জন্য একটি নতুন সংখ্যা হয়।
এসও সম্পর্কিত সম্পর্কিত প্রশ্ন, পিএলপিএইচএসকিএল সহ একটি পদ্ধতিগত সমাধান বিশিষ্ট একটি উত্তর :
শীর্ষের প্রয়োজনীয়তা যদি পারফরম্যান্স হয় তবে এই বিশেষ ক্ষেত্রে plpgsql ফাংশনটি সাধারণত দ্রুত হয় কারণ এটি একক স্ক্যানের ফলাফল গণনা করতে পারে।
একটানা সংখ্যার জন্য দ্রুত
আমরা আরও সহজ এবং দ্রুত সংস্করণের জন্য ক্রমাগত lap_no
একটি ক্রমকে সংজ্ঞায়িত করি এই সত্যটি আমরা বুঝতে পারি :
SELECT race_id, car_type, count(*) AS seq_len
FROM (
SELECT race_id, car_type
, row_number() OVER (PARTITION BY race_id, car_type ORDER BY lap_no) - lap_no AS grp
FROM tbl
) x
GROUP BY race_id, car_type, grp
ORDER BY seq_len DESC
LIMIT 1;
একটানা কোল শেষ হয় grp
। প্রতিটি অনুপস্থিত কোলে grp
প্রতি পার্টিশন কম হয় ।
এটি (race_id, car_type, lap_no)
সত্তার উপর নির্ভর করে UNIQUE NOT NULL
। নাল মান বা সদৃশ যুক্তি ভাঙ্গতে পারে।
জ্যাকের সহজ বিকল্প নিয়ে আলোচনা
@ জ্যাক এর সংস্করণ কার্যকরভাবে সব ল্যাপ (সারি), মোট ছাত্র যেখানে পূর্ববর্তী lap_no
এই race_id
একই ছিল car_type
। এটি সহজ এবং দ্রুত এবং সঠিক - যতক্ষণ car_type
না প্রত্যেকের জন্য প্রতি এক করে ক্রম থাকতে পারে race_id
।
তবে এমন কোনও কাজের জন্য যে কোয়েরিটি সহজ হতে পারে, তবুও। এটা তোলে কথাটি অনুসরণ করবে যে সব lap_no
প্রতি (car_type, race_id)
হতে হবে ক্রমানুসারে , এবং আমরা শুধু ল্যাপ গণনা পারে:
SELECT race_id, car_type, count(*) AS seq_len
FROM tbl
GROUP BY race_id, car_type
ORDER BY seq_len DESC
LIMIT 1;
তাহলে, অপরপক্ষে, এক car_type
থাকতে পারে একাধিক পৃথক ক্রমের প্রতি race_id (এবং প্রশ্ন অন্যথায় নির্দিষ্ট করে না), জ্যাক এর সংস্করণ ব্যর্থ হবে।
প্রদত্ত জাতি / গাড়ী ধরণের জন্য দ্রুত
প্রশ্নের মন্তব্যে / স্পষ্টতার জবাবে: প্রদত্ত একটিতে কোয়েরি সীমাবদ্ধ করা অবশ্যই (race_id, car_type)
এটি আরও দ্রুততর করবে , অবশ্যই:
SELECT count(*) AS seq_len
FROM (
SELECT row_number() OVER (ORDER BY lap_no) - lap_no AS grp
FROM tbl
WHERE race_id = 1
AND car_type = 'red'
) x
GROUP BY grp
ORDER BY seq_len DESC
LIMIT 1;
ডিবি <> ফিডল এখানে
পুরানো এসকিউএল ফিডল
সূচক
শীর্ষে পারফরম্যান্সের মূল কীটি হ'ল ফিটিং ইনডেক্স (একক অনুক্রমিক স্ক্যানের সাথে কাজ করা উল্লিখিত পদ্ধতিগত সমাধান ব্যতীত)। এর মতো একটি বহুবিধ সূচকটি সর্বোত্তমভাবে কাজ করে:
CREATE INDEX tbl_mult_idx ON tbl (race_id, car_type, lap_no);
আপনার টেবিল থাকে UNIQUE
আমি শীর্ষ, যে শুধু এই (অনন্য) সূচকের সাথে অভ্যন্তরীণভাবে বাস্তবায়িত হয় এ অধিকৃত বাধ্যতা, এবং আপনি কি না অন্য সূচক তৈরি করতে হবে।