Выборка строк между значениями поля

149
13 июля 2019, 08:20

Подскажите алгоритм решения задачки Есть таблица с действиями по электросчетчику

Дата действия   Действие
02.01.2017  Снятие показаний
04.01.2017  Отключение
01.02.2017  Снятие показаний
15.02.2017  Подключение
20.03.2017  Снятие показаний
20.04.2017  Снятие показаний
25.04.2017  Снятие показаний
20.05.2017  Снятие показаний
21.05.2017  Снятие показаний
21.06.2017  Снятие показаний

мне надо для расчета брать показания когда счетчик подключен, т.е. как-то игнорировать

04.01.2017  Отключение
01.02.2017  Снятие показаний

вот как сделать выборку между статусами подключен/отключен?

Answer 1

Навскидку так:

SELECT t1.*
FROM (SELECT * 
      FROM table 
      WHERE Action = 'Снятие показаний') t1
INNER JOIN (SELECT date 
            FROM table 
            WHERE Action = 'Подключение') t2 ON t1.date > t2.date
LEFT JOIN (SELECT date
           FROM table 
           WHERE Action = 'Отключение') t3 ON t1.date > t3.date 
                                          AND t3.date > t2.date
WHERE t3.date IS NULL
Answer 2
select *
  from (
    select date, status,
           @state:=@state+(
              case status when 'Отключение' then 1
                          when 'Подключение' then -1
                          else 0 end
           ) state
  from Tab, (select @state:=0) x
 order by date
) x
where state=0

Для MySQL 8.0 конструкцию с переменной можно заменить на оконную функцию с куммулятивной суммой по такому же case.

Answer 3

Смотрим в каждой строке на значение прошлой и принимает решение, - будут ли эта и следующие строки полезными, или бесполезными. В конечном счёте оставляем только полезные.

select action_date, action_type
from (
    select
        action_date,
        action_type,
        case
            when action_type = 'Подключение' then @is_useful := 1
            when action_type = 'Отключение' then @is_useful := 0
        end case_matrix,
        @is_useful current_useful
    from (
        select *
        from (
            select '02.01.2017' action_date, 'Снятие показаний' action_type union all
            select '04.01.2017', 'Отключение' union all
            select '01.02.2017', 'Снятие показаний' union all
            select '15.02.2017', 'Подключение' union all
            select '20.03.2017', 'Снятие показаний' union all
            select '20.04.2017', 'Снятие показаний' union all
            select '25.04.2017', 'Снятие показаний' union all
            select '20.05.2017', 'Снятие показаний' union all
            select '21.05.2017', 'Снятие показаний' union all
            select '21.06.2017', 'Снятие показаний'
        ) raw_data
        order by action_date
    ) ordered_data
    join (select @is_useful := 0) useful_flag
) useful_data
where current_useful = 1

Начальное значение флага is_useful отвечает за первые строки таблицы (у которых нет ведущей записи про подключаем/отключаем).

  action_date      action_type
1  15.02.2017      Подключение
2  20.03.2017 Снятие показаний
3  20.04.2017 Снятие показаний
4  20.05.2017 Снятие показаний
5  21.05.2017 Снятие показаний
6  21.06.2017 Снятие показаний
7  25.04.2017 Снятие показаний
READ ALSO
Создание относительного пути у ярлыка к html файлу

Создание относительного пути у ярлыка к html файлу

есть группа папок внутри которых есть html файлЕсть ярлык на определенный html и размещен вне папок

142
Кодировка html-файлов в Django на Visual Studio 2017

Кодировка html-файлов в Django на Visual Studio 2017

В проекте Django на Visual Studio 2017 контент-текст html-файлов работает только на латинницеПри смене на кириллицу - выдает ошибку кодировки

120
Документация по MS RDP Control C# .Net

Документация по MS RDP Control C# .Net

Не могу найти документацию по компоненту microsoft RDP control, хотелось бы изучить и понять как пользоваться этим

156
C# - Индекс находился вне границ массива

C# - Индекс находился вне границ массива

MainFormphrases - это текстовый документ в папке софта

111