2012-03-02 3 views
1

нового в MySQL и пытается нести что-то более от R.переформатировании (перестройки) таблицы данных с длиной до широкого использования MySQL

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

level2id | nestedid | 
1  | 1  | 
1  | 2  | 
1  | 3  | 
2  | 1  | 
2  | 2  | 
... 

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

level2id | nestedid1 | nestedid2 | nestedid3 | 
1  | 1   | 2   | 3   | 
2  | 1   | 2   |   | 
... 

Это так, что я потом могу выполнять присоединяется для извлечения информации о вложенномids для создания агрегированных значений для переменных, которые относятся к идентификатору level2. Тривиально, чтобы сделать в R, используя изменение для «изменяющихся во времени» данных, но не может найти очевидного решения для этого конкретного формата (т. Е. Где данные не организованы с точки зрения имен атрибутов и значений атрибутов в столбцах. Спасибо заранее!

+0

'Я хочу перестроить данные, используя MYSQL в новой таблице: «--- это очень плохая идея. Какова первоначальная причина? – zerkms

+2

Я не думаю, что это легко возможно в MySQL - если вы уже используете R, я бы предложил сделать перестройку в R. Вы можете попробовать ['sqldf'] (http://code.google.com/p/sqldf /) для выполнения SQL-подобных запросов в кадрах данных. –

+0

Есть много причин делать подобные вещи. В моем случае мне необходимо собрать информацию о физических лицах (nestedid) и обобщить эту информацию на уровне домашних хозяйств (уровень2). Однако я не просто хочу добавить несколько кросс-вкладок, потому что важны конкретные отношения между ними. – SMM

ответ

0

Хотя вы не можете сделать это, как SELECT, вы можете добиться этого с помощью вставки, которые работает только если первичный ключ Ls level2id или у вас есть уникальный индекс по этому level2id

структура таблицы

CREATE TABLE `table2` (
    `level2id` int(11) NOT NULL DEFAULT '0', 
    `nestedid1` int(11) NOT NULL, 
    `nestedid2` int(11) NOT NULL, 
    `nestedid3` int(11) NOT NULL, 
    PRIMARY KEY (`level2id`) 
) ENGINE=InnoDB; 

вставить инструкции SQL заменить таблицу1 на вашу старую таблицу

INSERT INTO table2 (level2id, nestedid1) SELECT level2id, nestedid FROM table1 WHERE nestedid = 1 ON DUPLICATE KEY UPDATE nestedid1 = nestedid; 
INSERT INTO table2 (level2id, nestedid2) SELECT level2id, nestedid FROM table1 WHERE nestedid = 2 ON DUPLICATE KEY UPDATE nestedid2 = nestedid; 
INSERT INTO table2 (level2id, nestedid3) SELECT level2id, nestedid FROM table1 WHERE nestedid = 3 ON DUPLICATE KEY UPDATE nestedid3 = nestedid; 

КЛЮЧ ОБНОВЛЕНИЕ DUPLICATE является расширением MySQL более подробно здесь http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

0

У меня была аналогичная проблема. Возможно, вы хотите взглянуть на динамический поворот в sql. Dynamic pivot table with multiple columns in sql server. Однако я действительно не рекомендую, если вы можете просто использовать команду перекроить в R.

0

Вы можете использовать MySQL, чтобы создать программу MySQL, которая будет исправить это:

USE test; 

/*Create long input table 'test' with variables of varying length*/ 
DROP TABLE nums; 
CREATE TABLE nums (id INT(2)); 
INSERT INTO nums 
VALUES 
(0), (1), (2), (3), (4), (5), (6), (7); 

DROP TABLE test; 
CREATE TABLE test (id INT(2), var VARCHAR(5), attribute VARCHAR(6), PRIMARY KEY (id, var)); 
INSERT INTO test 
SELECT nums3.*, REPEAT(CHAR(97+RAND()*24),CAST(6.*RAND() AS INT)) AS attribute 
FROM (SELECT DISTINCT nums2.id1 as id, CONCAT('var', LPAD(CAST(16.*RAND() AS INT),2,'0')) AS var 
FROM (SELECT DISTINCT nums.id as id1, nums1.id as id2 FROM nums, nums as nums1) AS nums2) AS nums3; 

/*Create SQL program to convert long to wide format (R: reshape)*/ 
SELECT DISTINCT CONCAT('DROP TABLE result;\nCREATE TABLE result (id INT(2), 
', GROUP_CONCAT(CONCAT(field) SEPARATOR ', '), ');') 
FROM 
(SELECT DISTINCT CONCAT(var, CONCAT(' VARCHAR(', max(length(attribute)), ')')) AS field 
FROM test GROUP BY var) AS fields 

UNION 

SELECT CONCAT("INSERT INTO result \nSELECT DISTINCT test.id, ", GROUP_CONCAT(var SEPARATOR '.attribute, '), 
".attribute FROM (SELECT DISTINCT id FROM test) AS test") 
FROM (SELECT DISTINCT var FROM test ORDER BY var) as vars 

UNION 

SELECT CONCAT("LEFT JOIN test AS ", var, " ON test.id = ", var, ".id AND ", var, ".var=", '"', var, '"') 
FROM (SELECT DISTINCT var FROM test ORDER BY var) as vars 

UNION 

SELECT ";" ; 

/*Copy output to screen editor, delete '|' symbols and superfluous white spaces. 
Then copy to MySQL prompt, run by pressing 'enter' key and view 'result'*/ 
Смежные вопросы