折叠稀疏矩阵的最佳方法
Posted
技术标签:
【中文标题】折叠稀疏矩阵的最佳方法【英文标题】:best way to collapse a sparsely populated matrix 【发布时间】:2009-01-21 17:52:17 【问题描述】:我有一个稀疏矩阵,它是一系列左连接的结果。我想把它折叠成一行(见下文)。我看到的唯一解决方案是 PK 上的 GROUP BY 和 ColA、ColB 等上的 MAX() 。性能在这里是一个大问题,所以我想知道是否有人有更好的解决方案。 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
【问题讨论】:
让我澄清一件事:“起点”已经是一个表,而不仅仅是您当前查询的结果集? (即,我们不能影响“起点”的生成方式?) 【参考方案1】:GROUPY BY + MAX 解决方案不错。因为无论您是否进行聚合,它都会扫描相同数量的记录。
我很想知道分组和不分组的时差是多少。
【讨论】:
+1。起初我误解了这个问题,但现在我弄明白了,我相信很难击败这个解决方案(除非,也许,如果你写一个程序来做)。【参考方案2】:我将其重写为 PIVOT,性能提高了约 30%。这并不容易,必须非常仔细地阅读this post。 PIVOT 很奇怪。
【讨论】:
【参考方案3】:稀疏矩阵在线性代数、数值方法和物理问题建模中很常见。如果矩阵是对角矩阵,则很容易使用单个向量来表示它。带宽方法可能需要存储非零元素的行和列索引。
谷歌搜索“稀疏矩阵存储”带来了很多点击,包括this。或许能激发一些想法。
【讨论】:
我没有对你投反对票。我认为如果人们要投反对票,他们应该有一个更好的答案! 不用担心。感谢您的反馈。以上是关于折叠稀疏矩阵的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章