• Как в PostgreSQL просуммировать Киловаты, группируя их по временным интервалам?

    @CopsisOnFire Автор вопроса
    Спасибо большое, сейчас буду разбираться) Понял в каком направлении двигаться!
  • Как в PostgreSQL просуммировать Киловаты, группируя их по временным интервалам?

    @CopsisOnFire Автор вопроса
    CREATE TABLE periods (endpoint_id int NOT NULL, mode_start timestamp with time zone not null, mode_duration interval second not null, lable varchar);
    INSERT INTO periods VALUES (500,'2020-09-02 04:41:00+03',58,'Работает'),
    (500,'2020-09-02 05:39:00+03',11,'Холостой ход'),
    (499,'2020-09-01 18:15:00+03',24,'Работает'),
    (499,'2020-09-01 18:39:00+03',6,'Холостой ход'),
    (500,'2020-09-02 05:50:00+03',12,'Работает'),
    (500,'2020-09-02 06:02:00+03',20,'Холостой ход'),
    (499,'2020-09-01 18:45:00+03',50,'Работает'),
    (499,'2020-09-01 20:02:00+03',143,'Работает'),
    (499,'2020-09-01 22:25:00+03',10,'Холостой ход'),
    (499,'2020-09-01 22:35:00+03',57,'Работает'),
    (499,'2020-09-01 23:32:00+03',23,'Холостой ход'),
    (499,'2020-09-02 02:51:00+03',20,'Холостой ход'),
    (499,'2020-09-02 03:11:00+03',51,'Работает'),
    (499,'2020-09-02 04:02:00+03',25,'Холостой ход'),
    (499,'2020-09-02 04:27:00+03',196,'Работает'),
    (499,'2020-09-02 08:03:00+03',12,'Работает'),
    (499,'2020-09-02 08:15:00+03',9,'Холостой ход'),
    (499,'2020-09-02 08:24:00+03',170,'Работает'),
    (499,'2020-09-02 11:14:00+03',29,'Отключено'),
    (499,'2020-09-02 11:43:00+03',2,'Холостой ход'),
    (499,'2020-09-02 11:45:00+03',149,'Работает'),
    (499,'2020-09-02 14:14:00+03',5,'Холостой ход'),
    (499,'2020-09-02 14:19:00+03',25,'Работает');
    CREATE TABLE energy (endpoint_id int NOT NULL, event_time timestamp with time zone not null, kwh real);
    INSERT INTO energy VALUES (499,'2020-09-01 00:48:00+03',1.57037),
    (499,'2020-08-01 00:00:00+03',1.44356),
    (499,'2020-08-01 00:01:00+03',1.49),
    (499,'2020-08-01 00:02:00+03',1.52698),
    (499,'2020-08-01 00:03:00+03',1.56503),
    (499,'2020-08-01 00:04:00+03',1.71035),
    (499,'2020-08-01 00:05:00+03',1.70528),
    (499,'2020-08-01 00:06:00+03',1.51452),
    (499,'2020-08-01 00:07:00+03',1.57223),
    (499,'2020-08-01 00:08:00+03',0.91082),
    (499,'2020-08-01 00:09:00+03',1.52336),
    (499,'2020-08-01 00:10:00+03',1.41534),
    (499,'2020-08-01 00:11:00+03',1.3472),
    (499,'2020-08-01 00:12:00+03',1.33368),
    (499,'2020-08-01 00:13:00+03',1.56258),
    (499,'2020-08-01 00:14:00+03',1.46562),
    (499,'2020-08-01 00:15:00+03',1.60518),
    (499,'2020-08-01 00:16:00+03',1.57198),
    (499,'2020-08-01 00:17:00+03',1.50983),
    (499,'2020-08-01 00:18:00+03',1.27549),
    (499,'2020-08-01 00:19:00+03',0.89764),
    (499,'2020-08-01 00:20:00+03',1.43172),
    (499,'2020-08-01 00:21:00+03',1.47538),
    (499,'2020-08-01 00:22:00+03',1.43812),
    (499,'2020-08-01 00:23:00+03',1.66106),
    (499,'2020-08-01 00:24:00+03',1.4382),
    (499,'2020-08-01 00:25:00+03',1.41112),
    (499,'2020-08-01 00:26:00+03',1.44488),
    (499,'2020-08-01 00:27:00+03',1.54296),
    (499,'2020-08-01 00:28:00+03',1.39613),
    (499,'2020-08-01 00:29:00+03',1.45879),
    (499,'2020-08-01 00:30:00+03',1.50776),
    (499,'2020-08-01 00:31:00+03',1.55307),
    (499,'2020-08-01 00:32:00+03',1.59479),
    (499,'2020-08-01 00:33:00+03',1.53096),
    (499,'2020-08-01 00:34:00+03',1.65781),
    (499,'2020-08-01 00:35:00+03',1.57903),
    (499,'2020-08-01 00:36:00+03',1.63683),
    (499,'2020-08-01 00:37:00+03',1.5815),
    (499,'2020-08-01 00:38:00+03',1.55591),
    (499,'2020-08-01 00:39:00+03',1.49254),
    (499,'2020-08-01 00:40:00+03',1.41156),
    (499,'2020-08-01 00:41:00+03',1.39998),
    (499,'2020-08-01 00:42:00+03',1.5354),
    (499,'2020-08-01 00:43:00+03',1.48522),
    (499,'2020-08-01 00:44:00+03',1.49633),
    (499,'2020-08-01 00:45:00+03',1.41097),
    (499,'2020-08-01 00:46:00+03',1.51953),
    (499,'2020-08-01 00:47:00+03',1.5062),
    (499,'2020-08-01 00:48:00+03',1.42921),
    (499,'2020-08-01 00:49:00+03',1.54109),
    (499,'2020-08-01 00:50:00+03',1.52605),
    (499,'2020-08-01 00:51:00+03',1.48257),
    (499,'2020-08-01 00:52:00+03',1.46525),
    (499,'2020-08-01 00:53:00+03',1.42068),
    (499,'2020-08-01 00:54:00+03',1.51646),
    (499,'2020-08-01 00:55:00+03',1.49364),
    (499,'2020-08-01 00:56:00+03',1.57517),
    (499,'2020-08-01 00:57:00+03',1.44778),
    (499,'2020-08-01 00:58:00+03',1.52561),
    (499,'2020-08-01 00:59:00+03',1.40461),
    (499,'2020-08-01 01:00:00+03',1.45197),
    (499,'2020-08-01 01:01:00+03',1.44529),
    (499,'2020-08-01 01:02:00+03',1.44221),
    (499,'2020-08-01 01:03:00+03',1.44335),
    (499,'2020-08-01 01:04:00+03',1.61045),
    (499,'2020-08-01 01:05:00+03',1.56319),
    (499,'2020-08-01 01:06:00+03',1.61044),
    (499,'2020-08-01 01:07:00+03',1.58775),
    (499,'2020-08-01 01:08:00+03',1.44699),
    (499,'2020-08-01 01:09:00+03',1.45558),
    (499,'2020-08-01 01:10:00+03',1.54828),
    (499,'2020-08-01 01:11:00+03',1.53741),
    (499,'2020-08-01 01:12:00+03',1.40249),
    (499,'2020-08-01 01:13:00+03',1.52177),
    (499,'2020-08-01 01:14:00+03',1.5041),
    (499,'2020-08-01 01:15:00+03',1.50229),
    (499,'2020-08-01 01:16:00+03',1.52355),
    (499,'2020-08-01 01:17:00+03',1.63393),
    (499,'2020-08-01 01:18:00+03',1.63801),
    (499,'2020-08-01 01:19:00+03',1.5351),
    (499,'2020-08-01 01:20:00+03',1.36033),
    (499,'2020-08-01 01:21:00+03',1.60733),
    (499,'2020-08-01 01:22:00+03',1.42616),
    (499,'2020-08-01 01:23:00+03',1.44254),
    (499,'2020-08-01 01:24:00+03',1.38529),
    (499,'2020-08-01 01:25:00+03',1.4762),
    (499,'2020-08-01 01:26:00+03',1.39034),
    (499,'2020-08-01 01:27:00+03',0.79388),
    (499,'2020-08-01 01:28:00+03',0.80149),
    (499,'2020-08-01 01:29:00+03',0.79984),
    (499,'2020-08-01 01:30:00+03',0.78684);
  • Как в PostgreSQL просуммировать Киловаты, группируя их по временным интервалам?

    @CopsisOnFire Автор вопроса
    alexalexes, да, всё верно. Во второй табличке тоже он есть. Убрал умышленно (как и некоторые другие столбики, не представляющие особой ценноси), чтобы особо на это не отвлекаться, так как как сопоставить айди труда для меня не составляет. Проблема именно во времени:(
    Прошу прощения, если этим ввёл кого-то в заблуждение :)
  • Как в PostgreSQL просуммировать Киловаты, группируя их по временным интервалам?

    @CopsisOnFire Автор вопроса
    alexalexes, по третьему вопросу. Первая табличка это результат уже моего запроса
    WITH table_periods AS (SELECT periods.endpoint_id, mode_start, (mode_start + mode_duration) AS mode_end,
    mode_duration, lable
    FROM periods
    ORDER BY mode_start DESC)
    SELECT * FROM table_periods

    Пытался я всё сделать вот таким образом, но ничего не вышло:
    WITH table_1 AS (SELECT periods.endpoint_id, mode_start, (mode_start + mode_duration) AS mode_end,
    mode_duration, lable
    FROM periods
    ORDER BY mode_start DESC)
    SELECT SUM(kwh) AS kwh
    FROM energy
    GROUP BY (BETWEEN table_1.mode_start AND table_1.mode_end)

    На самом деле уже кучу всего перепробовал. Но group by везде практически происходит просто по какой-либо колонке.
  • Как в PostgreSQL просуммировать Киловаты, группируя их по временным интервалам?

    @CopsisOnFire Автор вопроса
    alexalexes, Здравствуйте! Нет, максимального значения нет. Просто нужно суммировать все квтч которые произошли за период между event_start и event_end. Не понимаю как прописать group BY для того чтобы залефтджоинить таблички :( Отредактировал вопрос, внёс как выглядят таблицы. Буду очень признателен, если наведёте меня на мысль, как правильно сделать. Либо может статью, где описываются подобные случаи и как их решать.