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 | [τηλέφωνο] // λίστα_ban 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-запросы с условиями по дате бана и агрегированию сумм.