Как выполнить итеративный расчет с использованием значения из другой таблицы, выбранной на основе даты ГГГГ-ММ, и записать его обратно в первую таблицу? - PullRequest
1 голос
/ 06 апреля 2011

Вчера начал изучать PHP и MySQL и сумел создать две таблицы, вставить строки и затем отобразить эти данные на веб-странице, используя различные группы. Теперь мне нужно сделать расчет на основе данных в двух таблицах и записать результат обратно в одну из таблиц.

Я пытаюсь выяснить, как выполнить уравнение для строки с датой в таблице A, используя диапазон значений, связанный с диапазоном дат в таблице B. Эти две даты имеют формат YYYY-MM- ДД, но дни в основном не совпадают, поэтому мне нужно совпадать по месяцам.

Вот две таблицы, которые у меня есть:

Таблица A (пользователь)

+----+----------+------------+-------------+
| id | username | start-date | bench-value |
+----+----------+------------+-------------+
|  1 | tim      | 2010-03-04 |             |
+----+----------+------------+-------------+
|  2 | jim      | 2010-05-30 |             |
+----+----------+------------+-------------+
|  3 | fred     | 2010-06-12 |             |
+----+----------+------------+-------------+
|  4 | sam      | 2010-08-16 |             |
+----+----------+------------+-------------+
|  5 | jane     | 2010-10-21 |             |
+----+----------+------------+-------------+
|  6 | ella     | 2010-10-21 |             |
+----+----------+------------+-------------+
|  7 | bob      | 2011-01-24 |             |
+----+----------+------------+-------------+

Таблица B (ориентир)

+----+------------+---------+
| id | start-date |  value  |
+----+------------+---------+
|  1 | 2010-01-31 | 1173.19 |
+----+------------+---------+
|  2 | 2010-02-28 | 1199.85 |
+----+------------+---------+
|  3 | 2010-03-31 | 1264.91 |
+----+------------+---------+
|  4 | 2010-04-30 | 1263.43 |
+----+------------+---------+
|  5 | 2010-05-31 | 1211.36 |
+----+------------+---------+
|  6 | 2010-06-30 | 1187.32 |
+----+------------+---------+
|  7 | 2010-07-31 | 1218.30 |
+----+------------+---------+
|  8 | 2010-08-31 | 1207.96 |
+----+------------+---------+
|  9 | 2010-09-30 | 1272.12 |
+----+------------+---------+
| 10 | 2010-10-31 | 1280.27 |
+----+------------+---------+
| 11 | 2010-11-30 | 1275.60 |
+----+------------+---------+
| 12 | 2010-12-31 | 1346.45 |
+----+------------+---------+
| 13 | 2011-01-31 | 1337.07 |
+----+------------+---------+
| 14 | 2011-02-28 | 1338.37 |
+----+------------+---------+
| 15 | 2011-03-31 | 1349.14 |
+----+------------+---------+

А вот пример того, чего я пытаюсь достичь:

текущее значение Тима сегодня = сумма: (первая (benchmark.value) / последняя (benchmark.value)) за каждый месяц с первого по последний месяц включительно Первая дата = 2010-03, которая является идентификатором 3 = 1264.91 Последняя дата = 2011-03, т. Е. Идентификатор 15 = 1349.14 (это всегда последняя строка, поскольку я пытаюсь рассчитать «сегодня» и ничего в будущем)

1/(first/latest)   =1/(1264.91/1349.14) = 1.0666    [this is bench.id=3]
...now iterate...
1/(next/latest)    =1/(1263.43/1349.14) = 1.0678    [bench.id=4]
1/(next/latest)    =1/(1211.36/1349.14) = 1.1137    [bench.id=5]
1/(next/latest)    =1/(1187.32/1349.14) = 1.1363    [bench.id=6]
1/(next/latest)    =1/(1218.30/1349.14) = 1.1074    [bench.id=7]
1/(next/latest)    =1/(1207.96/1349.14) = 1.1169    [bench.id=8]
1/(next/latest)    =1/(1272.12/1349.14) = 1.0605    [bench.id=9]
1/(next/latest)    =1/(1280.27/1349.14) = 1.0538    [bench.id=10]
1/(next/latest)    =1/(1275.60/1349.14) = 1.0577    [bench.id=11]
1/(next/latest)    =1/(1346.45/1349.14) = 1.0020    [bench.id=12]
1/(next/latest)    =1/(1337.07/1349.14) = 1.0090    [bench.id=13]
1/(next/latest)    =1/(1338.37/1349.14) = 1.0080    [bench.id=14]
...and finish up...
1/(current/latest) =1/(1349.14/1349.14) = 1.0000    [bench.id=15]

Total = 13.7997 = 1.0666 + 1.0678 + 1.1137 + 1.1363 + 1.1074 + 1.1169 + 1.0605 + 1.0538 + 1.0577 + 1.002 + 1.009 + 1.008 + 1

Итак, я бы хотел записать этот результат обратно в таблицу A, дав мне:

Таблица A (пользователь)

+----+----------+------------+-------------+
| id | username | start-date | bench-value |
+----+----------+------------+-------------+
|  1 | tim      | 2010-03-04 |     13.7997 |
+----+----------+------------+-------------+

Поскольку это итеративный процесс, для такого пользователя, как 'bob', начавшегося в 2011-01 году, расчет будет намного короче.

Я также хотел бы иметь возможность делать это каждые 4 месяца, чтобы получать статистику по срокам, чтобы такой пользователь, как пользователь tim, рассчитывался следующим образом (первоначальный поиск, чтобы найти первую дату, должен был принимать во внимание в течение 4 месяцев. период):

1/(first/latest)   = 2010-03 = 1/(1264.91/1349.14) = 1.0666
1/(next/latest)    = 2010-07 = 1/(1218.30/1349.14) = 1.1074
1/(next/latest)    = 2010-11 = 1/(1275.60/1349.14) = 1.0577
1/(current/latest) = 2011-03 = 1/(1349.14/1349.14) = 1.0000

Total = 1.0666 + 1.1074 + 1.0577 + 1 = 4.2317

У меня есть две главные проблемы: 1. как использовать значение user.start-date для каждого пользователя, чтобы выбрать первое (benchmark.value) на основе года и месяца (день не важен). 2. как итеративно рассчитать формулу до и включая самое последнее значение в таблице результатов - в конце апреля добавится новая строка с id = 16, и если она будет выполнена, то апрельское значение станет последним значением используется в расчете.

Пока я изучаю SQL и PHP, я не уверен, какие части этого процесса следует выполнять в SQL, а какие в PHP.

Любая помощь будет принята с благодарностью, поскольку я полон решимости выяснить это.

У меня есть две главные проблемы:

  1. как использовать значение user.start-date для каждого пользователя выбрать первый (benchmark.value) на основе год и месяц (день неважно).
  2. как итеративно вычислить Формула до и в том числе последнее значение в таблице скамейки - при конец апреля, новый ряд с ID = 16 будет добавлено, и если это были запущены тогда апрельское значение будет стать последним значением, использованным в расчет.

Поскольку я сейчас изучаю SQL и PHP, я не уверен, какие части этого процесса следует выполнять в SQL, а какие в PHP.

Любая помощь будет принята с благодарностью, так как я полон решимости выяснить это.

Просто для справки, я читал:

Там почти слишком много информации, поэтому некоторые руководствовавшиеся советы были бы очень благодарны. Еще раз спасибо.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2011

Ух ты, какой хорошо заданный вопрос.К сожалению, мой ответ может быть намного короче.

Я думаю, что вы ищете:

текущее значение скамьи Боба сегодня = сумма: first (benchmark.value) /самое позднее (benchmark.value) Первая дата = 2011-01, который является идентификатором 13 = 1337,07 Последняя дата = 2011-03, который является идентификатором 15 = 1349,14

select username, start_date, tmp.value/tmp2.value as new_mark from tablea
 join (select id,value from tableb having id=min(id) group by id) as tmp
 on tablea.id=tmp.id 
join  (select id,value from tableb having id=max(id) group by id) as tmp2 
on tablea.id=tmp2.id 

Это кажется уродливым, но должно работать.

0 голосов
/ 06 апреля 2011

Я бы не включал значение столбца в таблицу A. Это значение будет постоянно меняться, поэтому было бы лучше создать представление, которое будет вычислять последнее значение параметра пользователя, или создать хранимую процедуру, которая принимаетПользователь в качестве параметра, а затем возвращает эталонное значение

. Между этими двумя таблицами также должна быть ссылка / ключ, сейчас нет способа определить, какой пользователь связан с каким эталонным значением

...