2017-01-20 1 views
0

У меня есть эта таблица (have a look on SQLFiddle) В предыдущих шагах номер записи был определен и значениями для «PREVVAL» и "NewVal «были рассчитаны.MySQL, как представить результаты в день (начальное значение, общее изменение и день конечного значение из таблицы

конечное значение ЗАПИСИ (в» NewVal «), становится начальным значением следующей записи (в» PREVVAL «)

Я хотел бы, чтобы уплотнить таблицу в с уч образом, что существует только одна запись в день, содержащий:

  • начальное значение даты «StartOfDay»,
  • общее изменение в течение дня «TotalChange» и
  • в результате день-конечное значение «EndOfDay»

желаемый результат можно увидеть в демонстрационной таблице "ChangesPerDay Сжатый "

Кто может помочь мне решить эту проблему (хранимая процедура в порядке). Thnx

ответ

1

Я немного путаю сыворотки, номера записей идут обратным образом. Но, тем не менее, вы могли бы решить это, оценив исходное значение и сумму мутаций в отдельности, а затем добавив их все, чтобы получить конечное значение. Заказ результатов, опускающихся по мере того, как номер записи снова должен быть ниже для более высокой даты.

insert into ChangesPerDayCondensed 
select @recrd:[email protected]+1, a.MyDate, b.PrevVal, a.Mutation, b.PrevVal+a.Mutation 
from 
(select MyDate, sum(Mutation) as Mutation from MutationsPerDay group by MyDate) a, 
(select b.MyDate, b.PrevVal from (select MyDate, max(RecNo) as RecNo from MutationsPerDay group by MyDate) a, MutationsPerDay b where a.RecNo = b.RecNo) b, 
(select @recrd:=0) c 
where a.MyDate = b.MyDate order by MyDate desc; 
+0

Оба ответа дают правильный результат! В обоих случаях я хотел бы получить некоторое объяснение. Я в значительной степени понимаю эти решения, однако я недостаточно опыт, чтобы создать такое решение самостоятельно. Не могли бы вы прояснить немного больше (графически?), Которые были очень важны. Причина, по которой номера записей «идут противоположным образом», состоит в том, что записи были вставлены с датами, отсортированными по убыванию. и номер записи является полем автоматического номера (PK, если хотите), оцененным в момент ввода. Таким образом, номера PK увеличиваются, а значения даты снижаются. – Paul

1

Я хотел бы сделать это следующим образом:

Сначала создать поиск на каждый день (найти первые и длится ReqNo), а затем присоединиться два раза в ежедневную таблицу и рассчитать изменения:

SELECT first_.MyDate, 
     first_.PrevVal AS StartOfDay, 
     last_.NewVal AS EndOfDay, 
     (last_.NewVal - first_.PrevVal) AS TotalChange 
FROM 
    (SELECT mpd1.MyDate, 
      max(mpd1.RecNo) AS first_rec_no, 
      min(mpd1.RecNo) AS last_rec_no 
    FROM MutationsPerDay mpd1 
    GROUP BY MyDate) AS lo 
JOIN MutationsPerDay AS first_ ON lo.first_rec_no = first_.RecNo 
JOIN MutationsPerDay AS last_ ON lo.last_rec_no = last_.RecNo 

Объяснение: То, что вы на самом деле хотите это: Для каждый деньпервый и последняя Значение (и разница). Так что вам нужно найти первое для каждого дня идентификатор из первого и последнего значения:

SELECT mpd1.MyDate, 
     max(mpd1.RecNo) AS first_rec_no, 
     min(mpd1.RecNo) AS last_rec_no 
FROM MutationsPerDay mpd1 
GROUP BY MyDate 

---------------------------------------------------- 
| MyDate    | first_rec_no | last_rec_no | 
---------------------------------------------------- 
| 2016-12-05 00:00:00 | 16   | 13   | 
| 2016-12-07 00:00:00 | 12   | 12   | 
| 2016-12-12 00:00:00 | 11   | 8   | 
| 2016-12-14 00:00:00 | 7   | 7   | 
| 2016-12-20 00:00:00 | 6   | 6   | 
| 2016-12-21 00:00:00 | 5   | 4   | 
| 2016-12-28 00:00:00 | 3   | 3   | 
| 2016-12-29 00:00:00 | 2   | 2   | 
| 2016-12-30 00:00:00 | 1   | 1   | 
---------------------------------------------------- 

Затем вы можете использовать эти первый и последние идентификаторы, чтобы найти соответствующие значения в источнике Таблица. Например, для 2016-12-21 вы получите строки с идентификаторами первым: 5 и последнее: 4

Запись PREVVAL нет 5 не представляет собой первое значение, которое вы видели в этот день и NewVal в записи № 4 представляет последнее значение, которое вы видели в этот день. Если вы вычтите их, вы получите изменение на этот день.

Надеюсь, это немного разъяснит методологию.

+0

Оба ответа дают правильный результат! В обоих случаях я хотел бы получить некоторое объяснение. Я в значительной степени понимаю эти решения, однако я недостаточно опыт, чтобы создать такое решение самостоятельно. Не могли бы вы прояснить немного больше (графически?), Которые были очень важны. – Paul

+0

Я добавил некоторое объяснение, к сожалению, не графическое;) –

+0

Clear enough.Thnx – Paul

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