我有一个包含以下值的表:
Value
0
1.2
1.3
1.4
0
1.2
1.3
1.4
从上面的数据中,我需要将设置重置为0后的2个最高数字相加,从而得到总数2.8。
如果每次有0时我都可以重新启动row_number(),那将是完美的,但是它不提供这样的功能。
感谢。
答案 0 :(得分: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 :(得分: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分组使用max aggregate和voilá!