1. সমষ্টি বিশ্লেষণে ভূমিকা

এগ্রিগেশন অপারেশন ডাটাবেস কুয়েরি এর মধ্যে একটি অত্যন্ত গুরুত্বপূর্ণ ধারণা। এটা সাধারণত যোগফল, গণনা, গড়, সর্বাধিক এবং সর্বনিম্ন মান সহ পরিসংখ্যান বিশ্লেষণ জন্য ব্যবহৃত হয়। এই অপারেশনগুলি ব্যবহারকারীদের বড় পরিমাণের তথ্য থেকে গুরুত্বপূর্ণ তথ্য বের করার সাহায্য করে, ডেটা বিশ্লেষণ এবং সিদ্ধান্ত নেওয়ার জন্য সাপোর্ট করে। ডাটাবেসে উদ্যোগ করা ফাংশনগুলি সাধারণত সমষ্টি ফাংশনসমূহ হিসেবে পরিচিত হয়।

2. মৌলিক সমষ্টিশীল অপারেশন

2.1 সমষ্টি ফাংশনের ধারণা

ডাটাবেস কুয়েরি ভাষার মধ্যে ব্যবহৃত হওয়া অ্যাগ্রিগেট ফাংশনগুলি একটি অনুক্রমের গণনা করার জন্য ব্যবহৃত হয়। SQL এবং অনুরূপ কুয়েরি ভাষাগুলিতে, সমষ্টি ফাংশনগুলি একটি ডেটার কলামে অপারেশন করতে পারে এবং একটি একক মান ফেরত দিতে পারে, যেমন: যোগ (SUM), গড় (AVG), গণনা (গণনা), সর্বাধিক (সর্বাধিক) এবং সর্বনিম্ন (সর্বনিম্ন)। যখন আমাদের কাজে ডেটা পরিসংখ্যান করতে হয়, তবে সমষ্টি ফাংশনগুলি তথ্য সেট প্রসেস করার জন্য গুরুত্বপূর্ণ সরঞ্জাম হিসেবে ব্যবহার হয়।

2.2 একক-ক্ষেত্রের সমষ্টিশীলতা

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

func Do(ctx context.Context, client *ent.Client) {
    // পেমেন্ট এন্টিটির জন্য পরিশোধের পরিমাণ গণনা করুন
    যোগ, ত্রুটি := ক্লায়েন্ট.পেমেন্ট.কুয়েরি().
        সমষ্টি()
            ent.Sum(payment.Amount),
        ).
        Int(ctx)
    if err != nil {
        log.Fatalf("Failed to get the sum: %v", err)
    }
    log.Printf("পেমেন্টের মোট পরিমাণ: %d", sum)
}

উপরের কোড স্নিপেটে, আমরা client.Payment.Query() ব্যবহার করে পেমেন্ট এন্টিটির জন্য একটি কুয়েরি আরম্ভ করি, তারপর ent.Sum ফাংশন কে payment.Amount হিসেবে প্যারামিটার হিসেবে কল করার জন্য Aggregate() মেথড ব্যবহার করি পেমেন্টের একটি সমষ্টি পরিমাণ গণনা করার জন্য। আমরা পরিমাণটি ইন্টিজার এ রূপান্তর করতে এবং এটি লগ করতে .Int(ctx) ব্যবহার করি।

2.3 বহু-ফিল্ড সমষ্টি

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

এই উদাহরণে, আমরা পেট টেবিলের বয়স ক্ষেত্রের যোগ, সর্বনিম্ন, সর্বাধিক এবং গণনা করব।

func Do(ctx context.Context, client *ent.Client) {
    var v []struct {
        Sum, Min, Max, Count int
    }
    err := client.Pet.Query().
        Aggregate(
            ent.Sum(pet.FieldAge), // বয়সের যোগ
            ent.Min(pet.FieldAge), // ন্যূনতম বয়স
            ent.Max(pet.FieldAge), // সর্বাধিক বয়স
            ent.Count(),           // গণনা
        ).
        Scan(ctx, &v)
    if err != nil {
        log.Fatalf("কুয়েরি ব্যর্থ হয়েছে: %v", err)
    }
    // সমষ্টি ফলাফলগুলি সমস্ত আউটপুট
    for _, agg := range v {
        fmt.Printf("যোগ: %d ন্যূনতম: %d সর্বাধিক: %d গণনা: %d\n", agg.Sum, agg.Min, agg.Max, agg.Count)
    }
}

উপরের কোডে, আমরা Aggregate ফাংশন ব্যবহার করে বহু-ফিল্ড সমষ্টি অপারেশন করার জন্য ব্যবহার করতে পারি, এবং পরিসংখ্যানের ফলাফলগুলি v অ্যারেতে সংরক্ষণ করতে Scan ফাংশনটি ব্যবহার করি। তারপর, আমরা v এ পরিসংখ্যান ফলাফলগুলির সমস্ত আউটপুট দেখানোর জন্য মোট v এ চালু করি।

3. গ্রুপ বায় সমষ্টির এ্যপ্লিকেশন

3.1. Group By ব্যবহার করে ক্ষেত্র গ্রুপ করা

ডাটাবেস অপারেশনে, Group By ডাটা গ্রুপ বানানোর জন্য একটি সাধারণ পদ্ধতি। এই বিভাগে, আমরা জানবো কীভাবে ডাটাবেজে ডাটাকে Group By ব্যবহার করে গ্রুপ করতে হয়।

টিউটোরিয়াল উপায়, কীভাবে Group By ব্যবহার করে এক বা একাধিক ক্ষেত্র গ্রুপ করতে হয়।

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

func Do(ctx context.Context, client *ent.Client) {
    নাম, ত্রুটি := ক্লায়েন্ট.ইউজার.
        কুয়েরি().
        GroupBy(user.FieldName).
        Strings(ctx)
    if err != nil {
        log.Fatalf("গ্রুপ করা কুয়েরি অনুষ্ঠান করতে ব্যর্থ: %v", err)
    }
    // প্রতি গ
### 3.2. গ্রুপ করা এবং একাধিক ফিল্ড সংযোজন

কখনও আমরা চাইব ডেটা গুলি একাধিক ফিল্ড ভিত্তিক গ্রুপ করে এবং প্রতি গ্রুপের উপর অ্যাগ্রিগেট ফাংশন পালন করতে। নিচেরটি এই চাহিদার পূর্ণকরণের একটি উদাহরণ:

নিচের কোড দেখায় যেভাবে ইউজার টেবিলে ডেটা গুলি কে `নাম` এবং `বয়স` ফিল্ডের উপর ভিত্তি করে গ্রুপ করা হয়, এবং প্রতি গ্রুপের মোট বয়স এবং ব্যবহারকারী গুলির সংখ্যা গণনা করা হয়।

```go
func Do(ctx context.Context, client *ent.Client) {
    var v []struct {
        Name  string `json:"name"`
        Age   int    `json:"age"`
        Sum   int    `json:"sum"`
        Count int    `json:"count"`
    }
    err := client.User.Query().
        GroupBy(user.FieldName, user.FieldAge).
        Aggregate(ent.Count(), ent.Sum(user.FieldAge)).
        Scan(ctx, &v)
    if err != nil {
        log.Fatalf("একাধিক ফিল্ড গ্রুপ এবং সংমিশ্রণ প্রশ্নের সফলতার জন্য নিষ্পন্ন করতে ব্যর্থ: %v", err)
    }
    // প্রতিটি গ্রুপের জন্য বিস্তারিত তথ্য আউটপুট
    for _, group := range v {
        fmt.Printf("নাম: %s বয়স: %d মোট: %d গণনা: %d\n", group.Name, group.Age, group.Sum, group.Count)
    }
}

উদাহরণটিতে, আমরা শুধুমাত্র ইউজার টেবিলের নাম এবং বয়স ফিল্ড এর উপর ডেটা গুলি গ্রুপ করি নি, বরং প্রতিটি গ্রুপের মোট রেকর্ডের সম্পূর্ণ বয়স এবং মোট সংখ্যা গণনা করতে গণনা এবং মোট অ্যাগ্রিগেট ফাংশনগুলি ব্যবহার করি।

4. গ্রুপ বাই এবং হ্যাভিং কে একত্রিত করা

হ্যাভিং ক্লজ হ্যাভিং করতে গ্রুপ বাই অপারেশনের পরে প্রাপ্ত সংগ্রহের ফলাফল ফিল্টার করে। নীচের উদাহরণে প্রদর্শিত হল কীভাবে প্রতিটি ভূমিকায় সর্বাধিক বয়স সংযুক্ত করা ইউজারদের কেবলমাত্র নির্বাচন করতে:

func Do(ctx context.Context, client *ent.Client) {
    var users []struct {
        Id      Int
        Age     Int
        Role    string
    }
    err := client.User.Query().
        Modify(func(s *sql.Selector) {
            s.GroupBy(user.FieldRole)
            s.Having(
                sql.EQ(
                    user.FieldAge,
                    sql.Raw(sql.Max(user.FieldAge)),
                ),
            )
        }).
        ScanX(ctx, &users)
    if err != nil {
        log.Fatalf("গ্রুপ বাই সাথে হ্যাভিং সংযুক্ত প্রশ্নে অগ্রাহ্য করতে ব্যর্থ: %v", err)
    }
    // হ্যাভিং শর্ত পূরণ করা ব্যবহারকারী তথ্য আওতা
    for _, user := range users {
        fmt.Printf("ID: %d বয়স: %d ভূমিকা: %s\n", user.Id, user.Age, user.Role)
    }
}

উপরের কোডটি প্রতিটি ভূমিকায় সর্বাধিক বয়স সংযুক্ত করা ইউজারদের বাছাই করার একইবোধে SQL প্রশ্ন তৈরি করবে।