2009-01-21 37 views
1

我有一個稀疏填充的矩陣,它是一系列左連接的結果。我想將它摺疊成一行(見下文)。我見過的唯一解決方案是PK上的GROUP BY和ColA上的MAX(),ColB等。性能是一個很大的問題,所以我想知道是否有人有更好的解決方案。列ColA,ColB等是已經被旋轉到列的行。我的理解是,我不能使用PIVOT,因爲列來自行(1到n),並且可能在任何給定時間改變。摺疊人口稀疏的矩陣的最佳方式

加入產生的SPM(不,我的表/ COLS是不是真的命名的):

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 
+0

讓我澄清一件事:「開始點」已經是一個表格,而不僅僅是您當前查詢的結果集合? (即,我們不會影響如何生成「起始點」?) – Reunanen 2009-01-21 18:17:45

+0

Pukku:更新了OP。 – jcollum 2009-01-23 01:47:12

回答

0

我重寫了這個作爲PIVOT並看到性能提高了約30%。這並不容易,必須非常仔細地閱讀this post。 PIVOTs很奇怪。

-2

稀疏矩陣在線性代數,數值方法和物理問題建模中很常見。如果一個矩陣是對角線的,使用單個矢量很容易表示它。帶寬方法可能需要存儲非零元素的行和列索引。

谷歌搜索「稀疏矩陣存儲」帶來了大量的點擊,包括this。也許它可以激發一些想法。

+0

我沒有倒下你。我認爲如果人們會倒下,他們應該*有更好的答案*! – jcollum 2009-01-21 18:22:53

3

GROUPY BY + MAX解決方案並不錯。由於它將掃描相同數量的記錄,無論您是否在進行聚合。

我很想知道有無分組的時間差異。