Как добавить несколько столбцов и получить максимальное значение? - PullRequest
0 голосов
/ 14 апреля 2020

На следующем рисунке показана таблица с 6 столбцами, заполненными числами.

enter image description here

SELECT MAX(col_6) AS c1,
       MAX(col_6 + col_5) AS c2,
       MAX(col_6 + col_5 + col_4) AS c3,
       MAX(col_6 + col_5 + col_4 + col_3) AS c4,
       MAX(col_6 + col_5 + col_4 + col_3 + col_2) AS c5
INTO OUTFILE 'path/to/file.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM table_1;

Этот код полезен в небольшой таблице, так как показано ниже.

enter image description here

К сожалению, я не могу выполнить подобный код, чтобы получить максимальные значения в 400 столбцах (вместо 5 столбцов, как показано в этом примере), поскольку строка кода будет слишком длинной.

Итак, я хотел бы попросить вашей помощи написать код, чтобы получить максимальное значение в столбце, а затем добавить этот столбец в предыдущий и получить максимальное значение, и так далее ... до 400 столбцов и получить максимальное значение.

Спасибо.

Обновление 1 (данные в виде текста). Первичный ключ: id

id, col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10

1,10,6,19,34,49,3 , 20,7,2,46

2,3,21,41,39,35,25,14,36,40,11

3,44,3,15,19 21,31,8,18,30,43

4,24,17,6,46,28,18,13,8,45,5

5,39,42 , 22,10,37,38,20,19,23,33

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Это довольно просто

С помощью этой процедуры

DROP procedure IF EXISTS `proc_add_userdata`;

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_add_userdata`(IN Number_columns INTEGER)
BEGIN
    DECLARE icount INTEGER DEFAULT Number_columns - 1;
    DECLARE addtext  LONGTEXT DEFAULT '';
    SET @sql = CONCAT('SELECT MAX(col_',Number_columns,'),');
    SET addtext = CONCAT('col_',Number_columns, ' + ');
    loop_label:  LOOP
        IF icount = 1 THEN
            SET addtext = CONCAT(addtext,'col_',icount);
            SET @sql = CONCAT(@sql,'MAX(',addtext, ") INTO OUTFILE 'path/to/file_with_results_1.csv' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' FROM userdata;");
            LEAVE  loop_label;
        END IF;
        SET addtext = CONCAT(addtext,'col_',icount);
        SET @sql = CONCAT(@sql,'MAX(',addtext, ' ),');
        SET addtext = CONCAT(addtext,' + ');
        SET icount = icount - 1;
    END LOOP;
    PREPARE stmt1 FROM @sql;
    EXECUTE stmt1; 
END$$

DELIMITER ;

И при этом вызове

CALL proc_add_userdata(10);

процедура построит этот запрос и выполнит его

SELECT 
    MAX(col_10)
    ,MAX(col_10 + col_9 )
    ,MAX(col_10 + col_9 + col_8 )
    ,MAX(col_10 + col_9 + col_8 + col_7 )
    ,MAX(col_10 + col_9 + col_8 + col_7 + col_6 )
    ,MAX(col_10 + col_9 + col_8 + col_7 + col_6 + col_5 )
    ,MAX(col_10 + col_9 + col_8 + col_7 + col_6 + col_5 + col_4 )
    ,MAX(col_10 + col_9 + col_8 + col_7 + col_6 + col_5 + col_4 + col_3 )
    ,MAX(col_10 + col_9 + col_8 + col_7 + col_6 + col_5 + col_4 + col_3 + col_2 )
    ,MAX(col_10 + col_9 + col_8 + col_7 + col_6 + col_5 + col_4 + col_3 + col_2 + col_1) 
FROM userdata;

РЕЗУЛЬТАТ

MAX(col_10) MAX(col_10 + col_9 )    MAX(col_10 + col_9 + col_8 )    MAX(col_10 + col_9 + col_8 + col_7 )    MAX(col_10 + col_9 + col_8 + col_7 + col_6 )    MAX(col_10 + col_9 + col_8 + col_7 + col_6 + col_5 )    MAX(col_10 + col_9 + col_8 + col_7 + col_6 + col_5 + col_4 )    MAX(col_10 + col_9 + col_8 + col_7 + col_6 + col_5 + col_4 + col_3 )    MAX(col_10 + col_9 + col_8 + col_7 + col_6 + col_5 + col_4 + col_3 + col_2 )    MAX(col_10 + col_9 + col_8 + col_7 + col_6 + col_5 + col_4 + col_3 + col_2 + col_1)
46          73                     91                               101                 133 170 200 241 262 283

Вы получаете картинку.

Вы можете улучшить хранимую процедуру, чтобы получить число столбцов, выполняющих запрос, см. { ссылка }

Также вы можете добавлять псевдоним am для каждого максимального значения, добавляемого для запятой (и, конечно, для icount = 1) a 'c _', icount

В целях отладки прокомментируйте подготовьте и извините за добавление - и добавьте строку SELECT @sql; так что вы получите текст и сможете проверить на наличие ошибок.

0 голосов
/ 14 апреля 2020

Показывает пример, используя только col_2 - col_6, как у вас. Полный запрос будет длинным, но не невозможным.

select max(col_6), max(col_5_on), max(col_4_on), max(col_3_on), max(col_2_on)
from (
    select
        id,
        sum(if(col>5,val,0)) col_6,
        sum(if(col>4,val,0)) col_5_on,
        sum(if(col>3,val,0)) col_4_on,
        sum(if(col>2,val,0)) col_3_on,
        sum(if(col>1,val,0)) col_2_on
    from (
        select id, 2 col, col_2 val from table_1
        union all
        select id, 3 col, col_3 val from table_1
        union all
        select id, 4 col, col_4 val from table_1
        union all
        select id, 5 col, col_5 val from table_1
        union all
        select id, 6 col, col_6 val from table_1
    ) split_data
    group by id
) summed_data;
...