лучший способ свернуть малонаселенную матрицу - PullRequest
1 голос
/ 21 января 2009

У меня есть малонаселенная матрица, которая является результатом серии левых объединений. Я хотел бы свернуть его в один ряд (см. Ниже). Единственное решение, которое я видел, это GROUP BY на ПК и MAX () на ColA, ColB и т. Д. Производительность - это огромная проблема, поэтому я хотел бы знать, есть ли у кого-нибудь лучшее решение. Столбцы ColA, ColB и т. Д. - это строки, которые были повернуты к столбцам. Насколько я понимаю, я не могу использовать PIVOT, потому что столбцы идут от строк (от 1 до n) и могут меняться в любой момент времени.

Join, который производит SPM (нет, мои таблицы / столбцы на самом деле не названы так):

    SELECT    
   mainTable.custNbr  
   , mainTable.custPartNbr             
    , [lkup colA].usr_def_attr as [colA]
    , [lkup colB].usr_def_attr as [colB]
    , [lkup colC].usr_def_attr as [colC]
    , [lkup colD].usr_def_attr as [colD]
    , [lkup colE].usr_def_attr as [colE]
  FROM db2.dbo.table2 as mainTable           
    LEFT JOIN db1.dbo.lookup as [colA]
        ON mainTable.lookupValue = [colA].lkup_id     
        and mainTable.cmply_typ_lkup_id = 166697 
    LEFT JOIN db1.dbo.lookup as [lkup colB]
        ON mainTable.lookupValue = [lkup colB].lkup_id    
        and mainTable.cmply_typ_lkup_id = 166700 
    LEFT JOIN db1.dbo.lookup as [lkup colC]
        ON mainTable.lookupValue = [lkup colC].lkup_id    
        and mainTable.cmply_typ_lkup_id = 166699 
    LEFT JOIN db1.dbo.lookup as [lkup colD]
        ON mainTable.lookupValue = [lkup colD].lkup_id    
        and mainTable.cmply_typ_lkup_id = 166696 
    LEFT JOIN db1.dbo.lookup as [lkup colE]
        ON mainTable.lookupValue = [lkup colE].lkup_id    
        and mainTable.cmply_typ_lkup_id = 166698

Результат:

PKCol   ColA    ColB    ColC    ColD    ColE
204045  NULL    NULL    NULL    NULL    23
204045  NULL    NULL    NULL    35  NULL
204045  NULL    NULL    35      NULL    NULL
204045  NULL    23  NULL    NULL    NULL
204045  23  NULL    NULL    NULL    NULL

Желаемый результат:

PKCol   ColA    ColB    ColC    ColD    ColE
20405   23  23  35      35  23

Ответы [ 3 ]

3 голосов
/ 21 января 2009

Решение GROUPY BY + MAX неплохое. Поскольку он будет сканировать одинаковое количество записей независимо от того, выполняете ли вы агрегаты или нет.

Мне было бы интересно узнать, какова разница во времени с группировкой и без нее.

0 голосов
/ 22 января 2009

Я переписал это как PIVOT и увидел увеличение производительности примерно на 30%. Это было непросто, пришлось очень внимательно читать этот пост . ПИВОТЫ странные.

0 голосов
/ 21 января 2009

Разреженные матрицы распространены в линейной алгебре, численных методах и моделирования физических задач. Если матрица диагональна, ее легко представить с помощью одного вектора. Подход с пропускной способностью может потребовать хранения как строк, так и столбцов для ненулевого элемента.

Поиск в Google для «скудного хранения матрицы» принес много хитов, включая this . Может быть, это может стимулировать некоторые идеи.

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