2011-03-10 85 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