প্রতিটি গ্রুপের সর্বাধিক মান নির্বাচন করুন


94
Name    Value   AnotherColumn
-----------
Pump 1  8000.0  Something1
Pump 1  10000.0 Something2
Pump 1  10000.0 Something3
Pump 2  3043    Something4
Pump 2  4594    Something5
Pump 2  6165    Something6

আমার টেবিলটি দেখতে এমন কিছু দেখাচ্ছে। আমি প্রতিটি পাম্পের জন্য সর্বোচ্চ মান কীভাবে নির্বাচন করব তা জানতে চাই।

select a.name, value from out_pumptable as a,
(select name, max(value) as value from out_pumptable where group by posnumber)g where and g.value = value

এই কোডটি কাজ করে তবে আমি পাম্প 1 এর দুটি এন্ট্রি পাই কারণ এটির একই মান সহ দুটি প্রবেশিকা রয়েছে।

উত্তর:


188
select name, max(value)
from out_pumptable
group by name

40
তবে পোস্টগ্র্রেস বা অন্য কোনও আরডিবিএমএসে কঠোরতার সাথে এটি কাজ করবে না GROUP BY। কঠোরভাবে আপনার GROUP BYপ্রতিটি কলামটি হয় আপনার SELECTউপস্থিত থাকতে হবে GROUP BYবা একটি সামগ্রিক ফাংশনে ব্যবহৃত হবে।
নিকঅ্যাব

4
ঠিক। এই প্রসঙ্গে "মাইএসকিউএল ইন ওয়ার্কস" এর মূল অর্থ এটি ক্রাশ হয় না, এটি প্রয়োজনীয় ফলস্বরূপ সঠিক ফলাফলটি দেয় না।
ক্রেগ

4
@ ক্রেইগ ভুল, এই ক্যোয়ারী আরডিবিএসের সমস্ত স্বাদে কাজ করে এবং প্রত্যাশার মতো ডেটা ফেরত দেয়, যেহেতু ওপি প্রতি গ্রুপে সর্বাধিক মান দিয়ে পুরো রেকর্ডটি ফেরত দেয় না, তবে প্রতি পাম্পের সর্বোচ্চ মান চায়। নির্বাচনী তালিকার 2 টি ক্ষেত্র রয়েছে: নাম এবং মান। নামটি দলে দলে গ্রুপে রয়েছে এবং সর্বাধিকের মাধ্যমে মান একত্রিত হয়। আমি উত্তরের কোনও সংস্করণ দেখতে পাচ্ছি না যেখানে নির্বাচিত তালিকায় আরও ক্ষেত্র থাকতে পারে।
শেডো

4
@ ক্রেইগ এটি ডিফল্ট আচরণ ছিল না। এটি প্রায় 3 বছর আগে v5.7.5 এ পরিবর্তিত হয়েছিল। তবে আবার আপনি এই বিষয়টিটি
শেডো

13
@ নিকআব আমি কি কিছু মিস করছি? প্রতিটি কলামে হয় বা একটি অ্যাগ্রিগেশন ফাংশনে দলের পারেন
রব

17
SELECT
  b.name,
  MAX(b.value) as MaxValue,
  MAX(b.Anothercolumn) as AnotherColumn
FROM out_pumptabl
INNER JOIN (SELECT 
              name,
              MAX(value) as MaxValue
            FROM out_pumptabl
            GROUP BY Name) a ON 
  a.name = b.name AND a.maxValue = b.value
GROUP BY b.Name

মনে রাখবেন আপনার যদি প্রাথমিক কী থাকে তবে এটি আরও সহজ হবে। এখানে একটি উদাহরণ

SELECT * FROM out_pumptabl c
WHERE PK in 
    (SELECT
      MAX(PK) as MaxPK
    FROM out_pumptabl b
    INNER JOIN (SELECT 
                  name,
                  MAX(value) as MaxValue
                FROM out_pumptabl
                GROUP BY Name) a ON 
      a.name = b.name AND a.maxValue = b.value) 

আহ, ডাং আমি উদাহরণটি খুব সহজ করে দিয়েছি। আরো কলাম আছে টেবিল, যা এটা একটু জটিল করে তুলতে> <।
ওয়েই ওং

যদি আরও কলামগুলি থাকে তবে সেগুলি নির্বাচন করুন
এম.এডমন্ডসন

আপনি কলামগুলিতে বিস্তারিত বলতে পারেন। আপনি কোনটি দ্বারা গ্রুপ করার চেষ্টা করছেন?
জন হার্টসক

@ ওয়াই ভুল আমি দেখতে পাচ্ছি যে আপনি আরও একটি কলাম যুক্ত করেছেন তবে আপনি এটির সাথে কী করতে চান তা ব্যাখ্যা করা দরকার? আপনি কি এই কলামটি থেকে কোনও মান ফিরিয়ে দিতে চান? আপনি কি নাম এবং সামোথারকলাম অনুসারে গ্রুপ করতে চান?
জন হার্টসক

অন্য কলাম যুক্ত হয়েছে। অন্যান্য স্তম্ভগুলি থেকে সর্বোচ্চ মানের সারিতে থাকা মানগুলির সাথে আমি প্রতিটি পাম্পের সর্বাধিক মান পেতে চাই। আমি কি খুব বিভ্রান্ত হচ্ছি?
ওয়াই ওয়াং

17
select name, value 
from( select name, value, ROW_NUMBER() OVER(PARTITION BY name ORDER BY value desc) as rn
from out_pumptable ) as a
where rn = 1

এটি আমার ক্ষেত্রে কাজ করে এমন একমাত্র উদাহরণ। 'তালিকাভুক্তি' প্রতি আমার একাধিক মান রয়েছে। আমার যা দরকার তা হ'ল প্রতিটি নথিভুক্তির সর্বশেষ মান, বাম বাহিরের যোগদান করুন। এর মাধ্যমে অর্ডার করা id DESCহয়েছে PARTITIONএবং এই কোয়েরিকে একটিতে মোড়ানো LEFT OUTER JOIN as grades ON grades.enrollment_id = enrollment.idএবং পুরোপুরি কাজ করে।
লুকাশারুদা ২

3
select Name, Value, AnotherColumn
from out_pumptable
where Value =
(
  select Max(Value)
  from out_pumptable as f where f.Name=out_pumptable.Name
)
group by Name, Value, AnotherColumn

এটি চেষ্টা করুন, এটি কাজ করে।



-3
SELECT DISTINCT (t1.ProdId), t1.Quantity FROM Dummy t1 INNER JOIN
       (SELECT ProdId, MAX(Quantity) as MaxQuantity FROM Dummy GROUP BY ProdId) t2
    ON t1.ProdId = t2.ProdId
   AND t1.Quantity = t2.MaxQuantity
 ORDER BY t1.ProdId

এটি আপনাকে ধারণা দেবে।

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