এসকিউএল কোয়েরিতে আমরা কেন গ্রুপ 1 টি এবং 1,2,3 দ্বারা গ্রুপ ব্যবহার করব?


26

এসকিউএল কোয়েরিতে, আমরা সামগ্রিক ফাংশন প্রয়োগ করতে ক্লজ দ্বারা গ্রুপ ব্যবহার করি।

  • কিন্তু গ্রুপ দ্বারা ক্লমের নামের পরিবর্তে সংখ্যার মান ব্যবহার করার পিছনে উদ্দেশ্য কী? উদাহরণস্বরূপ: 1 দ্বারা গ্রুপ।

3
প্রম্পটে order by 1বসে থাকলেই ব্যবহার করুন mysql> । কোডে, ব্যবহার করুন ORDER BY id ASC। কেস, সুস্পষ্ট ক্ষেত্রের নাম এবং সুস্পষ্ট ক্রম নির্দেশটি নোট করুন।
ডটানকোহেন

উত্তর:


28

আইএমএইচও করা আসলে এটি খুব খারাপ কাজ এবং এটি অন্যান্য বেশিরভাগ ডাটাবেস প্ল্যাটফর্মে সমর্থিত নয়।

লোকেরা এটি করার কারণগুলি:

  • তারা অলস - আমি কেন জানি না কেন লোকেরা আরও বেশি আক্ষরিক কোড পাওয়ার জন্য অতিরিক্ত 40 মিলিসেকেন্ডে টাইপ না করে টর্স কোড লিখে তাদের উত্পাদনশীলতা উন্নত বলে মনে করে।

এটি খারাপ হওয়ার কারণগুলি:

  • এটি স্ব-ডকুমেন্টিং নয় - কাউকে গোষ্ঠী নির্ধারণের জন্য নির্বাচনী তালিকাটি বিশ্লেষণ করতে যেতে হবে। এটি এসকিউএল সার্ভারে আসলে আরও কিছুটা পরিষ্কার হবে, যা মাইএসকিউএলের মতো গোষ্ঠীভুক্ত গোষ্ঠীগুলিকে সমর্থন করে না যারা জানেন-

  • এটি ভঙ্গুর - কেউ আসে এবং নির্বাচন তালিকা পরিবর্তন করে কারণ ব্যবসায় ব্যবহারকারীরা একটি ভিন্ন প্রতিবেদন আউটপুট চেয়েছিলেন, এবং এখন আপনার আউটপুট একটি গোলমাল। আপনি যদি গ্রুপের মাধ্যমে কলামের নামগুলি ব্যবহার করে থাকেন তবে SELECT তালিকার ক্রমটি অপ্রাসঙ্গিক হবে।

এসকিউএল সার্ভার অর্ডারকে [অর্ডিনাল] সমর্থন করে; এখানে এর ব্যবহারের বিরুদ্ধে কিছু সমান্তরাল যুক্তি রয়েছে:


9

মাইএসকিউএল আপনাকে GROUP BYএলিয়াস ( কলামের নাম সহ সমস্যা ) করার অনুমতি দেয়। এটি GROUP BYসংখ্যার সাথে করা আরও ভাল হবে ।

গুগলের কাছে এটি ব্যবহারের অনেকগুলি উদাহরণ রয়েছে এবং কেন অনেকে এটি ব্যবহার বন্ধ করে দিয়েছে।

আপনার সাথে সত্য কথা বলতে, আমি 1996 ORDER BYএবং তার GROUP BYপরে কলাম নম্বরগুলি ব্যবহার করি নি (আমি তখন ওরাকল পিএল / এসকিউএল ডেভেলপমেন্ট করছিলাম)। কলাম নম্বরগুলি ব্যবহার করা সত্যই পুরানো-টাইমারদের জন্য এবং পশ্চাদপটে সামঞ্জস্যতা যেমন বিকাশকারীদের মাইএসকিউএল এবং অন্যান্য আরডিবিএমএস ব্যবহার করার অনুমতি দেয় যা এখনও এটির জন্য অনুমতি দেয়।


8

নীচের ক্ষেত্রে বিবেচনা করুন:

+------------+--------------+-----------+
| date       | services     | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Apps         |         1 |
| 2016-05-31 | Applications |         1 |
| 2016-05-31 | Applications |         1 |
| 2016-05-31 | Apps         |         1 |
| 2016-05-31 | Videos       |         1 |
| 2016-05-31 | Videos       |         1 |
| 2016-06-01 | Apps         |         3 |
| 2016-06-01 | Applications |         4 |
| 2016-06-01 | Videos       |         2 |
| 2016-06-01 | Apps         |         2 |
+------------+--------------+-----------+

অ্যাপ্লিকেশন এবং অ্যাপ্লিকেশনগুলিকে একই পরিষেবা হিসাবে বিবেচনা করে আপনাকে প্রতিদিন পরিষেবাতে ডাউনলোডের সংখ্যা খুঁজে বের করতে হবে। দ্বারা গোষ্ঠীবদ্ধ date, servicesস্থাপিত হবে Appsএবং Applicationsপৃথক সেবা বিবেচনা করা হচ্ছে।

সেক্ষেত্রে ক্যোয়ারীটি হ'ল:

 select date, services, sum(downloads) as downloads
 from test.zvijay_test
 group by date,services

এবং আউটপুট:

+------------+--------------+-----------+
| date       | services     | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications |         2 |
| 2016-05-31 | Apps         |         2 |
| 2016-05-31 | Videos       |         2 |
| 2016-06-01 | Applications |         4 |
| 2016-06-01 | Apps         |         5 |
| 2016-06-01 | Videos       |         2 |
+------------+--------------+-----------+

অ্যাপ্লিকেশন এবং অ্যাপ্লিকেশনগুলি গোষ্ঠীভুক্ত করা হ'ল এটি আপনার প্রয়োজনীয়তা নয়। তাহলে আমরা কি করতে পারি?

একটি উপায় হ'ল একটি এক্সপ্রেশন বা ফাংশন ব্যবহার করে প্রতিস্থাপন Appsকরা এবং তারপরে সেবারগুলিতে সেগুলি গ্রুপ করা:ApplicationsCASEIF

select 
  date,
  if(services='Apps','Applications',services) as services,
  sum(downloads) as downloads
from test.zvijay_test 
group by date,services

তবে এটি এখনও পরিষেবাগুলিকে আলাদা আলাদা পরিষেবা হিসাবে বিবেচনা করে Appsএবং গোষ্ঠীভুক্ত করে Applicationsএবং আগের মতো একই আউটপুট দেয়:

+------------+--------------+-----------+
| date       | services     | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications |         2 |
| 2016-05-31 | Applications |         2 |
| 2016-05-31 | Videos       |         2 |
| 2016-06-01 | Applications |         4 |
| 2016-06-01 | Applications |         5 |
| 2016-06-01 | Videos       |         2 |
+------------+--------------+-----------+

একটি কলাম সংখ্যার উপর দলবদ্ধকরণ আপনাকে একটি এলিয়াসযুক্ত কলামে ডেটা গ্রুপ করার অনুমতি দেয়।

select
  date,
  if(services='Apps','Applications',services) as services,
  sum(downloads) as downloads
from test.zvijay_test
group by date,2;

এবং এইভাবে নীচের মত আপনি কাঙ্ক্ষিত আউটপুট প্রদান:

+------------+--------------+-----------+
| date       | services     | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications |         4 |
| 2016-05-31 | Videos       |         2 |
| 2016-06-01 | Applications |         9 |
| 2016-06-01 | Videos       |         2 |
+------------+--------------+-----------+

আমি অনেকবার পড়েছি যে কোয়েরি লেখার একটি অলস উপায় বা এলিয়াসেড কলামে গ্রুপিং মাইএসকিউএলে কাজ করে না, তবে এটি এলিয়াসযুক্ত কলামগুলিতে গ্রুপিংয়ের উপায়।

এটি ক্যোয়ারী লেখার পছন্দের উপায় নয়, কেবলমাত্র যখন আপনার কোনও এলিয়াস কলামের উপর গ্রুপবদ্ধ করতে হবে তখনই এটি ব্যবহার করুন।


" তবে এটি এখনও অ্যাপ্লিকেশন এবং অ্যাপ্লিকেশনগুলিকে পৃথক পরিষেবা হিসাবে বিবেচনা করে পরিষেবাগুলিকে গোষ্ঠী করে এবং আগের মত একই আউটপুট দেয় "। আপনি যদি ওরফেটির জন্য আলাদা (অ-বিরোধমূলক) নামটি বেছে নিয়ে থাকেন তবে কী এটি সমাধান হবে না?
32

3

এটি ব্যবহারের কোনও বৈধ কারণ নেই। এটি কেবলমাত্র একটি অলস শর্টকাট বিশেষভাবে তৈরি করা হয়েছিল যাতে কিছু হার্ড-চাপযুক্ত বিকাশকারীকে আপনার গ্রুপিং বা পরে বাছাই করা বা কলামের ক্রম পরিবর্তন করে কোডটি খারাপভাবে ব্যর্থ হতে দেয়। আপনার সহযোগী বিকাশকারীদের বিবেচনা করুন এবং এটি করবেন না।


0

এটি আমার জন্য কাজ করা হয়। কোডটি সারিগুলিকে 5 টি গ্রুপ পর্যন্ত বিভক্ত করে।

SELECT
USR.UID,
USR.PROFILENAME,
(
    CASE 
    WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN
        @curRow := 0
    ELSE
        @curRow := @curRow + 1 
        /*@curRow := 1*/ /*AND @curCode := USR.UID*/
    END
) AS sort_by_total  
FROM
    SS_USR_USERS USR,
    (
        SELECT
            @curRow := 0,
            @curCode := ''
    ) rt
ORDER BY
    USR.PROFILENAME,
    USR.UID

ফলাফল নিম্নলিখিত হিসাবে হবে

এখানে চিত্র বর্ণনা লিখুন


0
SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2;

SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2,3;

উপরের প্রশ্নগুলি বিবেচনা করুন: গ্রুপ 1 এর মাধ্যমে প্রথম কলাম দ্বারা গ্রুপ করা এবং 1,2 টির মাধ্যমে প্রথম এবং দ্বিতীয় কলাম দ্বারা গ্রুপ করা এবং 1,2,3 দ্বারা গ্রুপটি দ্বিতীয় এবং তৃতীয় কলামের মাধ্যমে গ্রুপ করা হবে। যেমন:

1,2 দ্বারা গ্রুপ

এই চিত্রটি প্রথম দুটি কলামকে ১,২ দ্বারা গোষ্ঠী দেখায় অর্থাৎ এটি ডেপ_ডেটের বিভিন্ন মান বিবেচনা করছে না গণনাটি খুঁজে বের করার জন্য (প্রথম দুটি কলামের সমস্ত স্বতন্ত্র সমন্বয় গণনা গণনা করার জন্য বিবেচনা করা হয়) অন্যদিকে দ্বিতীয় ক্যোয়ারির ফলাফল 1,2,3 দ্বারা গ্রুপ

চিত্র। এখানে এটি প্রথম সমস্ত তিনটি কলামকে বিবেচনা করছে এবং সেখানে গণনাটি খুঁজতে বিভিন্ন মান রয়েছে যেমন, এটি প্রথম তিনটি কলাম দ্বারা গোষ্ঠীভূত হয় (প্রথম তিনটি কলামের সমস্ত স্বতন্ত্র সমন্বয় গণনা গণনা করা হয়)।

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