2012-07-17 91 views
0

我在SQL Server數據庫表中有一列,有一列包含整數值,我想獲得最大值,除非系列中存在差距,那麼我想獲得第一個缺失的值。如何獲得包含順序int值的列中的第一個空位

例如從下面的表,我希望得到價值4

1 
2 
null 
3 

以上是簡單的,但如果表中包含類似下面的數據,我怎麼能找到我缺少其中的ID,這種情況下,這將是8

1 
3 
2 
4 
null 
5 
7 
6 
null 
10 
9 

//////////////////

編輯:

I最初實現了@ podiluska的答案,並且打算接受它,但是當我測試超過10K行的表時,它非常慢,所以我採用了@ vmvadivel的答案並稍微更改了它,如下所示,它的工作速度非常快,但仍然不是100%我想要的東西:

SELECT Number 
FROM 
(
    SELECT ROW_NUMBER() OVER(ORDER BY iValue) AS Number 
    FROM tblNumbers WHERE iValue IS NOT NULL 
) temp 
WHERE Number NOT IN 
(
    SELECT iValue FROM tblNumbers WHERE iValue IS NOT NULL 
) 

這工作得很好但是如果所有的iValue字段爲空,然後我沒有得到任何東西,但我想它返回1,因爲這將是第一個值在系列中,顯然我可以在C#代碼中處理這個問題,但是如果上面的查詢沒有返回一行,我相信必須有返回1的方法嗎?

我已經改變了頂級Select NumberSELECT Coalesce(Number, 1)但它沒有工作,任何想法如何解決這個問題?

感謝

+0

什麼版本的SQL Server? – 2012-07-17 09:35:47

+0

SQL Server 2008 R2 – 03Usr 2012-07-17 09:37:37

+0

您似乎在兩個地方都使用了tblNumbers。在WHERE子句中,將其更改爲具有您在問題中顯示的數據的實際表格。 tblNumbers應該有1到n個連續的運行號碼。 – vmvadivel 2012-07-18 02:47:51

回答

5

如果#t是你的表

select min(t1.number)+1 
from #t t1 
left join #t t2 
      on t1.number = t2.number-1 
where t2.number is null 
1
SELECT 
    t1.number + 1 AS range_start, 
    MIN(t2.number) - 1 AS range_end 
FROM test t1 
INNER JOIN test t2 
    ON t2.number > t1.number 
WHERE t1.number IS NOT NULL 
GROUP BY t1.number 
HAVING t1.number + 1 <= MIN(t2.number) - 1 

如果添加了許多15表,輸出將是:

range_start range_end 
      8   8 
     11   14 

它發現每次連續一對數字,至少有一個差距。然後它加上或減去一個,這樣start_rangeend_range是差距的範圍。

1

如果你有這它具有連續int值的數表,那麼你可以做這樣的事情:

SELECT * FROM 
(
    SELECT ROW_NUMBER() OVER(ORDER BY iValue) AS Number FROM tblNumbers 
) temp 
WHERE Number NOT IN 
(
    SELECT [ID] FROM tblFindGaps 
) 
GO 
+0

謝謝,即使這不是很正確,我認爲這是一個更好的解決方案,因爲如果我們在表格中有很多行,它比@ podiluska的答案更快。這並沒有處理這樣一個事實,即我們可以有多行,其中包含空值。我會解決這個問題,並在下面發表我自己的回答。 – 03Usr 2012-07-17 15:56:26

相關問題