Задать вопрос
deadloop
@deadloop
Активно осваиваю PHP

Как посчитать сумму уникальных записей за период времени?

Есть записи в базе:

CREATE TABLE test (
  id INT,
  bunker_id INT,
  bunker_sum INT,
  date DATETIME
);
INSERT INTO test (id, bunker_id, bunker_sum, date) VALUES (1,1,10,"2022-11-20 08:00:00");
INSERT INTO test (id, bunker_id, bunker_sum, date) VALUES (12,1,20,"2022-11-10 03:43:44");
INSERT INTO test (id, bunker_id, bunker_sum, date) VALUES (23,2,30,"2022-12-10 08:00:00");
INSERT INTO test (id, bunker_id, bunker_sum, date) VALUES (40,2,40,"2022-12-10 09:00:00");
INSERT INTO test (id, bunker_id, bunker_sum, date) VALUES (56,1,50,"2022-12-10 12:00:00");
INSERT INTO test (id, bunker_id, bunker_sum, date) VALUES (90,2,60,"2022-12-10 20:00:00");

Нужно сформировать запрос так, чтобы получить уникальные записи за период с 2022-12-10 08:00:00 по 2022-12-10 20:00:00, которые будут последними по времени и затем получить сумму этих записей.

В данном примере это будут записи с id 56 и 90, и сумма будет 110.
  • Вопрос задан
  • 216 просмотров
Подписаться 2 Простой 2 комментария
Решения вопроса 1
shabelski89
@shabelski89
engineer
в данном случае лучше обрабатывать записи в коде независимо от запроса:
1) получили строки с фильтром за период 2022-12-10 08:00:00 по 2022-12-10 20:00:00 (даты же явно из кода подставляться будут??)
2) нашли id нужных записей
3) сделали запрос SUM() с фильтром по id

а вот пример извращения в SQL

SELECT
    @ids := (
        SELECT
            GROUP_CONCAT(DISTINCT id SEPARATOR ',')
        FROM
            (
                SELECT
                    id
                FROM
                    test
                WHERE
                    date >= '2022-12-10 08:00:00'
                    AND date <= '2022-12-10 20:00:00'
                ORDER BY
                    date DESC
                LIMIT
                    2
            ) AS sub
    );

SELECT @ids;

SELECT
    SUM(bunker_sum)
FROM
    test
WHERE
    find_in_set(id, @ids);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы