Лучший способ свернуть малонаселенную матрицу

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

Присоединение, которое производит 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

Позвольте мне прояснить только одну вещь: «Начальная точка» - это уже таблица, а не просто набор результатов из вашего текущего запроса? (т.е. мы не можем повлиять на то, как создается "Начальная точка"?)

Reunanen 21.01.2009 21:17
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
376
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Поиск в Google по запросу "разреженное матричное хранилище" принес много запросов, в том числе это. Может быть, это может стимулировать некоторые идеи.

Я не голосовал против тебя. Я думаю, что если люди будут голосовать против, им следует есть лучший ответ!

jcollum 21.01.2009 21:22

Не волнуйтесь. Спасибо за ответ.

duffymo 21.01.2009 21:35

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

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

+1. Сначала я неправильно понял вопрос, но теперь, когда я понял это, я считаю, что это решение трудно превзойти (если, возможно, вы не напишите процедуру для этого).

Reunanen 21.01.2009 22:17
Ответ принят как подходящий

Я переписал это как PIVOT и увидел увеличение производительности примерно на 30%. Сделать это было непросто, пришлось очень внимательно прочитать эта почта. PIVOT странные.

Другие вопросы по теме