এসকিউএলে দক্ষতার সাথে কলামের মান সংঘটিত হবে কীভাবে?


166

আমার কাছে শিক্ষার্থীদের একটি টেবিল রয়েছে:

id | age
--------
0  | 25
1  | 25
2  | 23

আমি সমস্ত শিক্ষার্থীর জন্য জিজ্ঞাসা করতে চাই এবং একটি অতিরিক্ত কলাম যা গণনা করে যে একই বয়সের মধ্যে কত শিক্ষার্থী রয়েছে:

id | age | count
----------------
0  | 25  | 2
1  | 25  | 2
2  | 23  | 1

এটি করার সবচেয়ে কার্যকরী উপায় কী? আমি আশঙ্কা করছি যে একটি সাব-কোয়েরি ধীর হবে এবং আমি আরও ভাল উপায় আছে কিনা তা নিয়ে ভাবছি । আছে?

উত্তর:


255

এই কাজ করা উচিত:

SELECT age, count(age) 
  FROM Students 
 GROUP by age

আপনার যদি আইডির প্রয়োজন হয় তবে আপনি উপরেরটিকে সাব কিউরির মতো অন্তর্ভুক্ত করতে পারেন:

SELECT S.id, S.age, C.cnt
  FROM Students  S
       INNER JOIN (SELECT age, count(age) as cnt
                     FROM Students 
                    GROUP BY age) C ON S.age = C.age

2
দ্বিতীয় ক্যোয়ারির জন্য, বহিরাগত সিলেক্ট করা উচিত সিএনএন্টে কারণ কোনও এসসিএনটি নেই, অন্যথায় আপনি একটি ত্রুটি পান: অবৈধ কলামের নাম 'সিএনটি'
কেএম

1
আমি যখন পিজিএম গ্রুপ থেকে পিজিএম_কোড দ্বারা কেস_আইডি, গণনা (পিজিএম কোড) ব্যবহার করি তখন এটি আমার জন্য ত্রুটি দেয়; এটি অভিব্যক্তি অনুসারে একটি দল নয়
ষভ আগরওয়াল

26

যদি আপনি ওরাকল ব্যবহার করেন তবে বিশ্লেষণ নামে একটি বৈশিষ্ট্যটি কৌশলটি সম্পাদন করবে। দেখে মনে হচ্ছে:

select id, age, count(*) over (partition by age) from students;

যদি আপনি ওরাকল ব্যবহার না করে থাকেন তবে আপনাকে অবশ্যই গণনাগুলিতে ফিরে আসতে হবে:

select a.id, a.age, b.age_count
  from students a
  join (select age, count(*) as age_count
          from students
         group by age) b
    on a.age = b.age

2
এফওয়াইআই, এসকিউএল সার্ভার ২০০৫-এ, দ্বিতীয় কোয়েরিটি প্রথম হিসাবে প্রায় অর্ধেক নির্বাহের ব্যয় ( SET SHOWPLAN_ALL ON ) ব্যবহার করে চলে । আমি ভেবেছিলাম প্রথমটি আরও ভাল হত তবে পুরানো স্কুল জয়েন এটি মারবে।
কেএম

1
"পুরানো স্কুল যোগদান এটি মারবে" কেবলমাত্র এই কারণে প্রক্রিয়াজাত হওয়া মোট ROW COUNT টি আলাদা। দ্বিতীয় ক্যোয়ারিতে, এম্বেড করা গোষ্ঠী দ্বারা এই সম্ভাব্যভাবে সারিগুলির সংখ্যা হ্রাস করে। প্রথম ক্যোয়ারিতে DISTINCT যুক্ত করার চেষ্টা করুন: "শিক্ষার্থীদের থেকে DISTINCT আইডি, বয়স, গণনা (*) ওভার (বয়স অনুসারে পার্টিশন) নির্বাচন করুন" - এটি তুলনামূলক হওয়া উচিত
কোয়েটজলকোটল 23'13

19

এখানে আরও একটি সমাধান। এই এক খুব সহজ বাক্য গঠন ব্যবহার করে। গৃহীত সমাধানের প্রথম উদাহরণটি মাইক্রোসফ্ট এসকিউএল (যেমন 2000) এর পুরানো সংস্করণগুলিতে কাজ করে না

SELECT age, count(*)
FROM Students 
GROUP by age
ORDER BY age

1
আপনি যদি বয়স অনুসারে দলবদ্ধ হন তবে আপনি কেবল 25 বছরের বয়সের জন্য 2 টি গণনা সহ একটি প্রবেশিকা পাবেন (যখন তারা প্রকৃতপক্ষে 2 টি গণনা সহ 2 টি প্রবেশিকা এবং প্রদত্ত উদাহরণের জন্য পৃথক আইডি চান)?
ইয়ান

1
আয়ান, প্রতিক্রিয়ার জন্য ধন্যবাদ। আপনি কি এমএস এসকিউএল 2000 ডিবির বিরুদ্ধে আপনার দাবিটি কার্যকর করেছেন?
দামিয়ান

7

আমি এরকম কিছু করব:

select
 A.id, A.age, B.count 
from 
 students A, 
 (select age, count(*) as count from students group by age) B
where A.age=B.age;

4
select s.id, s.age, c.count
from students s
inner join (
    select age, count(*) as count
    from students
    group by age
) c on s.age = c.age
order by id

1

এবং যদি "বয়সের" কলামের ডেটাগুলির অনুরূপ রেকর্ড রয়েছে (যেমন অনেক লোকের বয়স 25 বছর, অনেকের 32 বছর বয়সী) তবে এটি প্রতিটি শিক্ষার্থীর ডান গণনাটি সারিবদ্ধ করার ক্ষেত্রে বিভ্রান্তি সৃষ্টি করে। এটি এড়াতে, আমি পাশাপাশি ছাত্র আইডির টেবিলগুলিতে যোগদান করেছি।

SELECT S.id, S.age, C.cnt
FROM Students S 
INNER JOIN (SELECT id, age, count(age) as cnt  FROM Students GROUP BY student,age) 
C ON S.age = C.age *AND S.id = C.id*
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.