sql row_number сбрасывается в 0 значение - PullRequest
1 голос
/ 10 марта 2011

У меня есть таблица со следующими значениями:

Value
0
1.2
1.3
1.4
0
1.2
1.3
1.4

Из приведенных выше данных мне нужно сложить самое высокое 2 число после того, как набор сброшен в 0, таким образом, получая в итоге 2,8.

Если бы я мог заставить row_number () перезапускаться каждый раз, когда появляется 0, это было бы идеально, однако он не предлагает такой функциональности.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 10 марта 2011
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 голос
/ 10 марта 2011

Ну, вы пытались использовать 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 и вуаля!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...