折叠稀疏矩阵的最佳方法

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。或许能激发一些想法。

【讨论】:

我没有对你投反对票。我认为如果人们要投反对票,他们应该有一个更好的答案 不用担心。感谢您的反馈。

以上是关于折叠稀疏矩阵的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

稀疏矩阵的压缩与还原

稀疏矩阵定义以及存储格式(COO,CSR,CSC)

稠密矩阵怎么转成稀疏矩阵 python

稀疏矩阵的运算

稀疏矩阵

使用密集和稀疏矩阵