Реорганизация таблицы MySQL в несколько строк по отметке времени - PullRequest
1 голос
/ 11 мая 2010

OK MySQL Wizards:

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

+----------+----------+------+-----+---------+-------+
| Field    | Type     | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| time     | datetime | NO   |     | NULL    |       | 
| probe_id | char(3)  | NO   |     | NULL    |       | 
| position | float    | NO   |     | NULL    |       | 
+----------+----------+------+-----+---------+-------+

Простой выбор выводит что-то вроде этого:

+---------------------+----------+----------+
| time                | probe_id | position |
+---------------------+----------+----------+
| 2010-05-05 14:16:42 | 00A      |   0.0045 | 
| 2010-05-05 14:16:42 | 00B      |   0.0005 | 
| 2010-05-05 14:16:42 | 00C      |    0.002 | 
| 2010-05-05 14:16:42 | 01A      |        0 | 
| 2010-05-05 14:16:42 | 01B      |    0.001 | 
| 2010-05-05 14:16:42 | 01C      |   0.0025 | 
| 2010-05-05 14:16:43 | 00A      |   0.0045 | 
| 2010-05-05 14:16:43 | 00B      |   0.0005 | 
| 2010-05-05 14:16:43 | 00C      |    0.002 | 
| 2010-05-05 14:16:43 | 01A      |        0 | 
|          .          |  .       |      .   |
|          .          |  .       |      .   |
|          .          |  .       |      .   |
+---------------------+----------+----------+

Однако я хотел бы вывести что-то вроде этого:

+---------------------+--------+--------+-------+-----+-------+--------+
| time                | 00A    | 00B    | 00C   | 01A | 01B   | 01C    |
+---------------------+--------+--------+-------+-----+-------+--------+
| 2010-05-05 14:16:42 | 0.0045 | 0.0005 | 0.002 | 0   | 0.001 | 0.0025 |
| 2010-05-05 14:16:43 | 0.0045 | 0.0005 | 0.002 | 0   | 0.001 | 0.0025 |
| 2010-05-05 14:16:44 | 0.0045 | 0.0005 | 0.002 | 0   | 0.001 | 0.0025 |
| 2010-05-05 14:16:45 | 0.0045 | 0.0005 | 0.002 | 0   | 0.001 | 0.0025 |
| 2010-05-05 14:16:46 | 0.0045 | 0.0005 | 0.002 | 0   | 0.001 | 0.0025 |
| 2010-05-05 14:16:47 | 0.0045 | 0.0005 | 0.002 | 0   | 0.001 | 0.0025 |
|          .          |    .   |    .   |   .   | .   |   .   |    .   |
|          .          |    .   |    .   |   .   | .   |   .   |    .   |
|          .          |    .   |    .   |   .   | .   |   .   |    .   |
+---------------------+--------+--------+-------+-----+-------+--------+

В идеале, различные столбцы положения зонда генерируются динамически на основе данных в таблице. Это возможно, или я выдергиваю волосы впустую?

Я пытался использовать время GROUP BY с GROUP_CONCAT, который примерно выводит данные, но я не могу разделить этот вывод на столбцы probe_id.

mysql> SELECT time, GROUP_CONCAT(probe_id), GROUP_CONCAT(position) FROM MG41 GROUP BY time LIMIT 10;
+---------------------+-------------------------+------------------------------------+
| time                | GROUP_CONCAT(probe_id)  | GROUP_CONCAT(position)             |
+---------------------+-------------------------+------------------------------------+
| 2010-05-05 14:16:42 | 00A,00B,00C,01A,01B,01C | 0.0045,0.0005,0.002,0,0.001,0.0025 | 
| 2010-05-05 14:16:43 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:44 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:45 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:46 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:47 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:48 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:49 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:50 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
| 2010-05-05 14:16:51 | 01C,01B,01A,00C,00B,00A | 0.0025,0.001,0,0.002,0.0005,0.0045 | 
+---------------------+-------------------------+------------------------------------+

Ответы [ 2 ]

2 голосов
/ 11 мая 2010
SELECT
    time,
    SUM(CASE WHEN probe_id = '00A' THEN position ELSE 0 END) `00A`,
    SUM(CASE WHEN probe_id = '00B' THEN position ELSE 0 END) `00B`,
    SUM(CASE WHEN probe_id = '00C' THEN position ELSE 0 END) `00C`,
    SUM(CASE WHEN probe_id = '01A' THEN position ELSE 0 END) `01A`,
    SUM(CASE WHEN probe_id = '01B' THEN position ELSE 0 END) `01B`,
    SUM(CASE WHEN probe_id = '01C' THEN position ELSE 0 END) `01C`
FROM MG41
GROUP BY time LIMIT 10;
1 голос
/ 11 мая 2010

Чтобы иметь динамическое количество строк, вам потребуется динамически сгенерированный запрос. (Если вы заранее знаете probe_ids, тогда вы можете использовать статический запрос.)

Общая форма будет

    SELECT time, P00A, P00B, ... P03B, etc..
    FROM 
       (SELECT time FROM MG41 GROUP BY time) allTimes
    INNER JOIN 
        (SELECT time, position AS P00A from MG41 WHERE probe_id='00A') pt00A 
        ON pt00A.time=allTimes.time   
   INNER JOIN 
        (SELECT time, position AS P00B from MG41 WHERE probe_id='00B') pt00B 
        ON pt00B.time=allTimes.time

etc...

Затем вы строите ВНУТРЕННИЕ СОЕДИНЕНИЯ и ВЫБРАННЫЕ строки для всех различных проб.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...