MySQL - извлечение строки из 2 таблиц на основе MAX (агрегированного значения) одной таблицы - PullRequest
0 голосов
/ 09 июня 2011

У меня есть 2 таблицы с одинаковой структурой, в которых 3 строки данных собираются каждые 5 минут.Из этого я пытаюсь извлечь одну строку в день, используя максимальное агрегированное значение T1.Например,

T1
dateTime |имя |значение
2011-06-05 00:00:00 |Джонни |20
2011-06-05 00:00:00 |Роберт |30
2011-06-05 00:00:00 |Лорен |24

2011-06-05 00:00:05 |Джонни |12
2011-06-05 00:00:05 |Роберт |10
2011-06-05 00:00:05 |Лорен |10
...
2011-06-06 00:00:00 |и т. д.

T2
dateTime |имя |значение
2011-06-05 00:00:00 |Джонни |8
2011-06-05 00:00:00 |Роберт |12
2011-06-05 00:00:00 |Лорен |24
2011-06-05 00:00:05 |Джонни |52
2011-06-05 00:00:05 |Роберт |16
2011-06-05 00:00:05 |Лорен |25
...
2011-06-06 00:00:00 |etc

В приведенном выше примере первые 3 строки T1 при агрегировании имеют более высокое значение (20 + 30 + 24), чем второй набор из 3 строк (12 + 10 + 10).После того, как я установил, какая временная метка имеет наибольшее (MAX) агрегированное значение из T1, я хочу получить относительное агрегированное значение из T2.В этом случае это будут значения в 00:00:00, которые составляют 8 + 12 + 24.Обратите внимание, что это займет несколько дней, поэтому желаемый результат будет:

dateTime |T1AggregatedValues ​​|T2AggregatedValues ​​
2011-06-05 00:00:00 |74 |44
2011-06-06 xTime |у |z
2011-06-07 xTime |у |z

Я пытался использовать SELECT * FROM T1 WHERE value=(SELECT MAX(value) FROM T1) в качестве отправной точки, но это просто дает мне одно максимальное значение для T1.Я действительно в растерянности относительно того, как прогрессировать?

1 Ответ

1 голос
/ 10 июня 2011
SELECT dateTime, SUM(value) AS valueSum
FROM T1
GROUP BY dateTime
ORDER BY valueSum DESC

Это даст вам все группы dateTime, перечисляя сначала самые высокие агрегаты. В зависимости от вашей логики вам, вероятно, придется учитывать возможность того, что несколько групп dateTime имеют одно и то же агрегированное значение, вместо того, чтобы предполагать, что 1-й результат является самым высоким.

Если вы точно знали, что получите только 1 группу с наивысшей совокупностью (нет возможности привязки к наивысшей совокупности), то вы можете сделать это:

SELECT dateTime, MAX(valueSum) FROM
(
    SELECT dateTime, SUM(value) AS valueSum
    FROM T1
    GROUP BY dateTime
    ORDER BY valueSum DESC
) AS sumTable

Какой бы метод вы ни использовали, чтобы изолировать одну группу, которую вы объявили как имеющую наибольшую совокупность, как только вы определите эту группу, вы затем берете dateTime указанной группы и извлекаете для нее SUM(value) из T2.

...