У меня есть редко заполненная матрица, которая является результатом серии левых объединений. Я хотел бы свернуть его в одну строку (см. Ниже). Единственное решение, которое я видел, - это 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


Разреженные матрицы распространены в линейной алгебре, численных методах и моделировании физических задач. Если матрица диагональна, ее легко представить с помощью одного вектора. Подход с использованием полосы пропускания может потребовать хранения индикаторов строки и столбца для ненулевого элемента.
Поиск в Google по запросу "разреженное матричное хранилище" принес много запросов, в том числе это. Может быть, это может стимулировать некоторые идеи.
Я не голосовал против тебя. Я думаю, что если люди будут голосовать против, им следует есть лучший ответ!
Не волнуйтесь. Спасибо за ответ.
Решение GROUPY BY + MAX неплохое. Поскольку он будет сканировать одно и то же количество записей, независимо от того, выполняете ли вы агрегаты.
Мне было бы любопытно узнать, какая разница во времени с группировкой и без нее.
+1. Сначала я неправильно понял вопрос, но теперь, когда я понял это, я считаю, что это решение трудно превзойти (если, возможно, вы не напишите процедуру для этого).
Позвольте мне прояснить только одну вещь: «Начальная точка» - это уже таблица, а не просто набор результатов из вашего текущего запроса? (т.е. мы не можем повлиять на то, как создается "Начальная точка"?)