Sobes.tech
Senior

Տվյալների հետևյալ սխեմայով տվյալների բազա կա // օգտվող id | անուն | ազգանուն | ծննդյան օր 1 | Ivan | Petrov | [հեռախոս] | Anna | Petrova | [հեռախոս] | Anna | Petrova | [հեռախոս] // գնում sku | գին | user_id | ամսաթիվ 1 | 5500 | 1 | [հեռախոս] | 5700 | 1 | [հեռախոս] | 4000 | 1 | [հեռախոս] | 8000 | 2 | [հեռախոս] | 400 | 2 | [հեռախոս] // արգելափակման_ցանկ user_id | մեկնարկի_թիվ 1 | [հեռախոս] Պահանջվում է ցուցադրել՝ 1. Յուրաքանչյուր օգտագործողի և ապրանքի ID-ի եզակի համադրությունները բոլոր գնումների համար, որոնք կատարվել են օգտագործողների կողմից նախքան նրանց արգելափակումը։ Սորտավորել նախ օգտվողի անունով, ապա SKU-ով 2. Գտնել այն օգտվողներին, ովքեր կատարել են գնումներ ավելի քան 5000 գումարով։ Նրանց անունները ցուցադրել հետևյալ ձևաչափով՝ user_id | անուն | ազգանուն | ընդհանուր գնումների գումարը

sobes.tech AI

Պատասխան AI-ից

Для решения задачи с базой данных можно использовать SQL-запросы, а в Go — выполнить их через стандартные библиотеки.

  1. Уникальные комбинации пользователя и id товара для покупок, совершённых до бана, отсортированные по имени и SKU:
SELECT DISTINCT u.firstname, u.lastname, p.sku
FROM purchase p
JOIN user u ON p.user_id = u.id
LEFT JOIN ban_list b ON p.user_id = b.user_id
WHERE b.date_from IS NULL OR p.date < b.date_from
ORDER BY u.firstname, p.sku;
  1. Пользователи с суммой покупок больше 5000:
SELECT u.id, u.firstname, u.lastname, SUM(p.price) AS total_spent
FROM purchase p
JOIN user u ON p.user_id = u.id
GROUP BY u.id, u.firstname, u.lastname
HAVING SUM(p.price) > 5000;

В Go можно выполнить эти запросы через database/sql и обработать результаты. Пример для второго запроса:

rows, err := db.Query(`
    SELECT u.id, u.firstname, u.lastname, SUM(p.price) AS total_spent
    FROM purchase p
    JOIN user u ON p.user_id = u.id
    GROUP BY u.id, u.firstname, u.lastname
    HAVING SUM(p.price) > 5000
`)
if err != nil {
    log.Fatal(err)
}

type UserSpending struct {
    ID        int
    FirstName string
    LastName  string
    Total     float64
}

var results []UserSpending
for rows.Next() {
    var u UserSpending
    if err := rows.Scan(&u.ID, &u.FirstName, &u.LastName, &u.Total); err != nil {
        log.Fatal(err)
    }
    results = append(results, u)
}
// results теперь содержит пользователей с суммой покупок > 5000

Таким образом, основная логика — корректно сформировать SQL-запросы с условиями по дате бана и агрегированию сумм.