2011-03-10 55 views
1

復位我有具有以下值的表:SQL ROW_NUMBER在0值

Value 
0 
1.2 
1.3 
1.4 
0 
1.2 
1.3 
1.4 

從以上數據,我需要總結2最高數後的設定被重置爲0,從而來到總共2.8。

如果我可以得到row_number()重新啓動每次有一個0,這將是完美的,但它不提供這樣的功能。

謝謝。

+1

您需要一個列來排序。我們可以假設一個id字段嗎? – 2011-03-10 15:30:20

+0

如果你可以使用'ROW_NUMBER()'和'PARTITION BY'子句來分隔你的數據,你可以使用'ROW_NUMBER()'。一個「類別」字段或類似的東西。您不能通過「當值重置爲0時」進行分區,但是..... – 2011-03-10 15:31:14

+0

@martin yes有一個Id字段 – 2011-03-10 15:31:50

回答

6
DECLARE @your_table TABLE (id INT,value FLOAT) 

INSERT INTO @your_table 
SELECT 1,0 UNION ALL 
SELECT 2,1.2 UNION ALL 
SELECT 3,1.3 UNION ALL 
SELECT 4,1.4 UNION ALL 
SELECT 5,0 UNION ALL 
SELECT 6,1.2 UNION ALL 
SELECT 7,1.3 UNION ALL 
SELECT 8,1.4 


;WITH T AS 
(
SELECT 
    ROW_NUMBER() OVER (PARTITION BY CASE WHEN value = 0 THEN 0 ELSE 1 END ORDER BY id)- 
    ROW_NUMBER() OVER (ORDER BY id) AS Grp 
,id,value 
FROM @your_table 
), T2 AS 
(
SELECT MAX(value) AS value 
FROM T 
WHERE value<>0 
GROUP BY Grp) 
SELECT SUM(value) 
FROM T2 
1

那麼,你有沒有嘗試使用RANK或DENSE_RANK與PARTITION BY子句?

好吧,我到達了@Martin的同一解決方案,我承認@marc_s,這沒有什麼簡單的。而且我還不夠聰明,無法找出兩個row_number組之間的關係,並且在這個表中減去它們的結果。

id value row_number 
1 0.0 0 
2 1.2 -1 
3 1.3 -1 
4 1.4 -1 
5 0.0 -3 
6 1.2 -2 
7 1.3 -2 
8 1.4 -2 

從這裏我認爲很明顯下一步該怎麼做。忽略零,按row_number分組使用最大聚合和voilá!

+0

似乎沒有任何東西通過分區,這就是問題.... – 2011-03-10 15:35:17

+1

嗯,我試圖在這裏創意,否則查詢的工作原理是什麼?如果沒有什麼可以通過最初創建行號進行排序,這是不可能的。 – 2011-03-10 15:39:24

+0

+1爲你的創造力 - 但這就是問題 - 我沒有看到任何「nice'n'easy」的方式,如果沒有分區可用.... – 2011-03-10 15:40:58