2015-10-02 2 views
3

У меня есть MySQL tbl с некоторыми колонками, где каждые 5 мин. новая строка вставляется с 3-мя значениямиОперация mysql arithmetik (вычитание) последний - первый день (неделя, месяц)

1. Auto inc. curent Date Unix timestamp --> date 
2. power consumption absolut --> wert01 
3. Power Generation absolut --> wert02 

Чтобы показать эту информацию в виде графика, на Exampl для еженедельного потребления электроэнергии, мне нужно выбрать первый и последний, который Allready работает, но тогда придется вычтем последний из первого и Show only tue result & день werk.

SELECT 
    (SELECT wert01 
    FROM sml_splitt 
    WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY 
    AND date < curdate() - INTERVAL DAYOFWEEK(curdate()) DAY 
    ORDER BY date DESC LIMIT 1) AS 'last', 

    (SELECT wert01 
    FROM sml_splitt 
    WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY 
    AND date < curdate() - INTERVAL DAYOFWEEK(curdate()) DAY 
    ORDER BY date LIMIT 1) AS 'lirst 

Я ищу несколько дней, чтобы найти решение, но безуспешно. Хопфулы, ты мог бы мне помочь.

+0

Будет ли полезен запрос, возвращающий среднюю по дате? – Selfish

+0

нет, не реально ... thx! –

ответ

0

Если вы счастливы с вашим запросом, то вы можете сделать математику, вкладывая его еще один раз, как это: http://sqlfiddle.com/#!9/515ef/1

select t1.last, t1.first, t1.last - t1.first as result 
from (
    select (
    select wert01 
    from sml_splitt 
    where dt >= curdate() - interval dayofweek(curdate()) + 6 day 
    and dt < curdate() - interval dayofweek(curdate()) day 
    order by dt desc limit 1 
) as 'last', 
    (
    select wert01 
    from sml_splitt 
    where dt >= curdate() - interval dayofweek(curdate()) + 6 day 
    and dt < curdate() - interval dayofweek(curdate()) day 
    order by dt limit 1 
) as 'first' 
) t1 
; 

Если вы действительно хотите работать с этими данными на неделю для целей отчетности , позвольте мне предложить пару взглядов. Первый даст вам все ваше отчетливого начала даты недели:

create view v1 as 
select date(dt) as week_begins 
from sml_splitt 
where dayofweek(dt) = 1 
group by week_begins 

второго вид присоединяется первым взгляд с самими собой, чтобы дать Вам диапазон неделю начала и неделю окончания:

create view v2 as 
select t1.week_begins, coalesce(t2.week_begins,now()) as week_ends 
from v1 t1 
left join v1 t2 
on t2.week_begins = t1.week_begins + interval 7 day 

Вы можете см. результаты здесь: http://sqlfiddle.com/#!9/a4d1b3/2. Обратите внимание, что я использую now(), чтобы получить текущую дату и время, если неделя еще не закончилась.

Оттуда вы можете присоединиться к своему представлению со своей исходной таблицей и использовать функцию min() и max() с группировкой, чтобы получить начальные и конечные значения «wert» и выполнить любые вычисления на них, которые вам нравятся.

Вот пример: http://sqlfiddle.com/#!9/a4d1b3/6

select week_begins, week_ends, 
min(wert01) as start_wert01, 
max(wert01) as end_wert01, 
max(wert01) - min(wert01) as power_consumed, 
min(wert02) as start_wert02, 
max(wert02) as end_wert02, 
max(wert02) - min(wert02) as power_generated, 
(max(wert02) - min(wert02)) - (max(wert01) - min(wert01)) as net_generated 
from v2 
inner join sml_splitt 
on sml_splitt.dt >= v2.week_begins 
and sml_splitt.dt < v2.week_ends 
group by week_begins 

Я надеюсь, что помогает.

+0

Спасибо, очень ... первое и второе решение работает для меня! –

+0

@SaschaSchmitt Это здорово. Если вы удовлетворены ответом, отметьте его как принятый. – Kendall

Смежные вопросы