Как мы можем сохранить результаты нескольких запросов, когда появляется только один? - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь рассчитать среднюю и максимальную скорость 20 плодовых мушек.У меня есть база данных с именем CSV_DAM_ACTIVITY, в которой есть 20 столбцов по одному на каждую муху.Каждая строка представляет движение, совершенное в течение минуты мухой X. Как только я открываю базу данных в браузере БД для SQLite, я вхожу в окно «Запуск SQL».У меня нет трудностей получить максимальную и среднюю скорость за 1 полет, введя: select max(ROI_1), avg(ROI_1) as moyenne from CSV_DAM_ACTIVITY; Но когда я пытаюсь получить результаты для всех мух, я вижу только последний результат: максимальную и среднюю скорость для мух 20.

Сначала я попытался сохранить данные в таблице:

    create table z (a int not null,b int not null);
    insert into t values ( max(ROI_1)from CSV_DAM_ACTIVITY , avg(ROI_1) ) from  CSV_DAM_ACTIVITY);
    select * from t ;

Но я получил следующую ошибку:

   Result: near "from": syntax error
   At line 1:
   insert into t values( max(ROI_1)from

Я также попытался:

   create table droso ( maxi1 int not null , moyenne1 int not null ,   maxi2 int not null ,   moyenne2 int not null ,   maxi3 int not null ,   moyenne3 int not null ,    maxi4 int not null ,   moyenne4 int not null , maxi5 int not null ,   moyenne5 int not null ,  maxi6 int not null ,   moyenne6 int not null ,  maxi7 int not null ,   moyenne7 int not null ,   maxi8 int not null ,   moyenne8 int not null , maxi9 int not null ,   moyenne9 int not null ,  maxi10 int not null ,   moyenne10 int not null , maxi11 int not null ,   moyenne11 int not null ,   maxi12 int not null ,   moyenne12 int not null ,   maxi13 int not null ,   moyenne13 int not null ,  maxi14 int not null ,   moyenne14 int not null , maxi15 int not null ,   moyenne15 int not null ,  maxi16 int not null ,   moyenne16 int not null ,  maxi17 int not null ,   moyenne17 int not null ,  maxi18 int not null ,   moyenne18 int not null ,  maxi19 int not null ,   moyenne19 int not null ,  maxi20 int not null ,   moyenne20 int not null) ;
   insert into droso select max(ROI_1),avg(ROI_1),  max(ROI_2),  avg(ROI_2),  max(ROI_3),  avg(ROI_3),   max(ROI_4),  avg(ROI_4),max(ROI_5),  avg(ROI_5) , max(ROI_6),  avg(ROI_6) , max(ROI_7),  avg(ROI_7),  max(ROI_8),  avg(ROI_8) ,max(ROI_9),  avg(ROI_9), max(ROI_10),  avg(ROI_10) ,max(ROI_11),  avg(ROI_11),  max(ROI_12),  avg(ROI_12),  max(ROI_13),  avg(ROI_13), max(ROI_14),  avg(ROI_14),max(ROI_15),  avg(ROI_15), max(ROI_16),  avg(ROI_16), max(ROI_17),  avg(ROI_17), max(ROI_18),  avg(ROI_18), max(ROI_19),  avg(ROI_19), max(ROI_20),  avg(ROI_20),from CSV_DAM_ACTIVITY ;
   select * from droso ;

Но получил ту же ошибку

Затем я попытался отобразить все результаты напрямую, нажав:

 select max(ROI_1), avg(ROI_1) as moyenne from CSV_DAM_ACTIVITY; 
   select max(ROI_2), avg(ROI_2) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_3), avg(ROI_3) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_4), avg(ROI_4) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_5),  avg(ROI_5) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_6), avg(ROI_6) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_7), avg(ROI_7) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_8), avg(ROI_8) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_9), avg(ROI_9) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_10), avg(ROI_10) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_11), avg(ROI_11) as moyenne from CSV_DAM_ACTIVITY; 
   select max(ROI_12), avg(ROI_12) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_13), avg(ROI_13) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_14), avg(ROI_14) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_15), avg(ROI_15) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_16), avg(ROI_16) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_17), avg(ROI_17) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_18), avg(ROI_18) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_19), avg(ROI_19) as moyenne from CSV_DAM_ACTIVITY;
   select max(ROI_20), avg(ROI_20) as moyenne from CSV_DAM_ACTIVITY;`

Это показало только результаты fly 20

Iпытался все это поместить в одну инструкцию:

   select max(ROI_1),avg(ROI_1),  max(ROI_2),  avg(ROI_2),  max(ROI_3),  avg (ROI_3),   max(ROI_4),  avg(ROI_4),max(ROI_5),  avg(ROI_5) , max(ROI_6),  avg(ROI_6) , max(ROI_7),  avg(ROI_7),  max(ROI_8),  avg(ROI_8) ,max(ROI_9),  avg(ROI_9), max(ROI_10),  avg(ROI_10) ,max(ROI_11),  avg(ROI_11),  max(ROI_12),  avg(ROI_12),  max(ROI_13),  avg(ROI_13), max(ROI_14),  avg(ROI_14),max(ROI_15),  avg(ROI_15), max(ROI_16),  avg(ROI_16), max(ROI_17),  avg(ROI_17), max(ROI_18),  avg(ROI_18), max(ROI_19),  avg(ROI_19), max(ROI_20),  avg(ROI_20),  from CSV_DAM_ACTIVITY ;

показала следующую ошибку: result: near "from":syntax error

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

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

CREATE TABLE CSV_DAM_ACTIVITY(ROI_1, ROI_2, ..., ROI_20);

Более совершенный дизайн таблицы будет содержать скорость каждой мухи при заданной отметке времени в одном ряду:

CREATE TABLE fly_data(fly_id INTEGER, minute INTEGER, speed NUMERIC,
                      PRIMARY KEY(fly_id, minute)) WITHOUT ROWID;

ТогдаВы можете получить список максимальной и средней скоростей каждой мухи с помощью:

SELECT fly_id, max(speed), avg(speed) FROM fly_data GROUP BY fly_id ORDER BY fly_id;

Самый простой способ преобразовать данные CSV в эту структуру - это, вероятно, быстрый ETL perl (Или python илилюбой язык сценариев, который вам нравится) сценарий, который превращает 1 строку файла CSV в 20 вставок.

INSERT INTO fly_data(fly_id, minute, speed) VALUES(1, 1, $row_1_col_1_value);
INSERT INTO fly_data(fly_id, minute, speed) VALUES(2, 1, $row_1_col_2_value);
...
INSERT INTO fly_data(fly_id, minute, speed) VALUES(1, 20, $row_20_col_1_value);
-- etc.

или, возможно, непосредственно в sqlite с кучей вставок, таких как

INSERT INTO fly_data(fly_id, minute, speed)
  SELECT 1, rowid, roi_1 FROM CSV_DAM_ACTIVITY;
INSERT INTO fly_data(fly_id, minute, speed)
  SELECT 2, rowid, roi_2 FROM CSV_DAM_ACTIVITY;
-- and so on

.как вполне безопасное предположение, что значения CSV_DAM_ACTIVITY rowid представляют порядок вставки строк (и, следовательно, отметок времени) из файла CSV, равны true.

( БЕЗ ROWID описание)

0 голосов
/ 08 июля 2019

Вы получаете ошибки синтаксиса.1-е утверждение:

create table z (a int not null,b int not null);
insert into t values ( max(ROI_1)from CSV_DAM_ACTIVITY , avg(ROI_1) ) from  CSV_DAM_ACTIVITY);
select * from t ;

должно быть записано:

create table z (a int not null,b int not null);
insert into z(a, b) 
select max(ROI_1), avg(ROI_1) from CSV_DAM_ACTIVITY;

Вы можете найти больше здесь: SQLite Insert Это вставит в новую таблицу z 1 строку со значениями max(ROI_1) и avg(ROI_1).Во втором и последнем утверждении удалите последнюю запятую перед from.

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