2009-07-14 54 views
3

行篩選SELECT語句我有一個從表中選擇不同的行有兩個價值指數與人口最多的列

SELECT distinct Reference, Value1, Value2, Value3, Value4 FROM [tblHistory] 

在提到與另一場「項目」索引的語句。對於一個特定的系統,這個數據被插入到另一個只使用Reference作爲索引的表中,因爲Value1到Value4對於同一個Reference應該總是相同的 - 但是在大約1/500中不是這樣。

在一個或多個Value1-Value4字段中存在重複引用AND差異的情況下,我需要選擇具有最完整的Value1-Value4字段的行,因爲它們通常是NULL。如果所有實例具有相同數量的填充列,我可以返回找到的第一行。

除了使用臨時表和代碼像

case when Value1 is null then 1 else 0 end 
+ case when Value2 is null then 1 else 0 end 
+ case when Value3 is null then 1 else 0 end 
+ case when Value4 is null then 1 else 0 end 
as CountOfNulls 

有沒有一種方法對數據進行篩選,所以我只得到人口最多的行?

我運行MS SQL Server 2000的

+0

我認爲評價最「完整的」排你的case語句大約有效率,你會得到它 – 2009-07-14 21:46:23

回答

1

你可以看着凝聚功能,但坦率地說,你有上面的我可能會做的case語句。

你不想使用它的原因是什麼?

根據評論,該表不只是4個值字段。但恐懼的是,保留最高數量的零點的臨時桌子是必要的。

我覺得案例解決方案可能實現到視圖中仍然是一個可行的,很好的解決方案。

+0

首先因爲在現實中有更多的列有4! 其次,我希望它是一個簡單的過程,而不是一個臨時表。也許有沒有一個乾淨的方法來做到這一點,而不是做一個臨時表,並保持每個引用CountOfNulls最高? – PCurd 2009-07-14 15:15:10

+1

實際上並不需要臨時表,只需在其中創建視圖並進行計算,它應該是1次。 – 2009-07-14 16:02:39

1

這只是一個預感,因爲我沒有看到你的數據庫,但它看起來像是一張表,實際上應該是兩張。正如我所說,這可能是出於表現或其他合法原因,但你需要報告的方式表明這個表應該分裂。儘管如此,如果我沒有其他選擇,我會創建一個列填充行數的列,並在每次特定記錄更新時以編程方式更新它。

0

那麼它不是做一個偉大的方式,但我已經把這段代碼和它的工作原理:

SELECT distinct Reference, Value1, Value2, Value3, Value4 

FROM [tblHistory] 
WHERE Reference+cast(4-(case when Value1 is null then 1 else 0 end 
+ case when Value2 is null then 1 else 0 end 
+ case when Value3 is null then 1 else 0 end 
+ case when Value4 is null then 1 else 0 END) AS varchar) IN (

SELECT myref + CAST(MAX(CountOfNonNulls) AS VARCHAR) FROM 
(

SELECT myref, 4-(case when Value1 is null then 1 else 0 end 
+ case when Value2 is null then 1 else 0 end 
+ case when Value3 is null then 1 else 0 end 
+ case when Value4 is null then 1 else 0 end) 
as CountOfNonNulls 

FROM [tblHistory] 
)l 
GROUP BY Reference 
) 

我實際上沒有該表的結構,所以我沒有測試它,但它似乎工作。這個想法是通過將最高CountOfNonNulls添加到引用字段並使用它來限制選擇來創建一個「新」密鑰 - 它意味着令人討厭的CASE代碼運行兩次,但我有的其他過濾器(未顯示)將總體限制爲我的系統大概有80行,所以我可以忍受這一點。

我還沒有看到它會做什麼,如果有兩行具有相同的CountOfNonNulls值但不同的Value1-Value4字段 - 我認爲它會中斷。在這種情況下,我可能會將Value1-Value4字段添加到我的「新」鍵,但這有點傻。

任何改善建議將非常感謝!

1

-- count() will not include NULL, so we can avoid making complex conditions 
; 
with 
sum_cnt 
(
    Reference, 
    cnt 
) 
as 
(
    select 
     Reference, 
     count(Value1) + count(Value2) + count(Value3) + count(Value4) 
    from 
     tblHistory 
    group by 
     Reference 
) 
select top 1 
    Reference 
from 
    sum_cnt 
order by 
    cnt desc