2014-11-05 3 views
0

я столкнулся один вопрос в запросе нижев SQL, имеющих проблемы с формированием

CREATE TABLE #tmp(rowid int,settle_id int) 
insert into #tmp 
select top 100 
case when row_number() over (order by settle_id) > 10 then row_number() over (order by settle_id) - 10 else row_number() over (order by settle_id) end as rowid,settle_id from student_id(nolock) 
select * from #tmp 
drop table #tmp 

Я хочу строка идентификатор должен начинаться с 1 -> 10 каждый раз, но и для первых двух наборов она начинается с 1-> 10 но там после этого начинается с 11. Пожалуйста, дайте мне знать, чего я не вижу.

+0

Вы должны пометить свой вопрос в базе данных, которую используете. –

+0

Добавлен тег 'sql-server', основанный на синтаксисе' # tmp' и 'top 100' –

ответ

1

Используйте нижеследующий запрос, чтобы получить ожидаемый результат .

SELECT 
CASE WHEN ((row_number() over(order by settle_id) % 10) = 0) 
    THEN 10 
    ELSE (row_number() over (ORDER BY settle_id) % 10) 
END AS RowID, settle_id 
FROM student 
1

Try с использованием арифметических операций по модулю:

select ((row_number() over (order by settle_id) - 1) % 10) + 1 as rowid, settle_id 
from student; 

Некоторые базы данных используют mod() функцию вместо %.

+0

Выше запроса запустите rowid только из 2. – Veera

+1

поэтому используйте -1 вместо +1 - примените некоторую базовую математику !! –

+1

@Veera. , , 'row_number()' начинается с 1, но по модулю начинает возвращаться в 0. Решение состоит в том, чтобы вычесть 1, а затем добавить его обратно. –

Смежные вопросы