2010-12-16 2 views
2

Ниже приведен пример того, что я хочу сделать:Как создать ROWNUM в SQL Server

declare @table table(col1 varchar(10),col2 varchar(10)); 
insert into @table(col1,col2) values ('a1','5340'); 
insert into @table(col1,col2) values ('a1','3340'); 
insert into @table(col1,col2) values ('a1','9185340'); 
insert into @table(col1,col2) values ('b1','1110'); 

Вот таблица и примеры данных. Теперь, как я хочу результат, как показано ниже:

select * from @table 

col1 col2  seq 
a1 5340  1 
a1 3340  2 
a1 9185340 3 
b1 1110  1 

Если вы заметили здесь, то SEQ сбрасывается обратно в 1 для нового значения COL1. И я не хочу менять порядок значений в COL2. то есть. значение 5340 должно быть 1 и так далее.

Это всего лишь пример данных. Но реальные данные поступают из другой таблицы, поэтому значения не фиксируются только на 4 строки.

Любая помощь будет оценена по достоинству. Thank You

+0

Вы хотите, чтобы значение `seq` основывалось на порядке вставки? – 2010-12-16 01:06:07

+0

Точно. Я хочу, чтобы значение SEQ основывалось на вставке. На самом деле сначала будут вставлены данные с COL1 = a1, поэтому его последовательность будет 1,2,3 .. – niceApp 2010-12-16 01:20:57

ответ

4

Просто используйте обычный IDENTITY столбец в качестве SEQ:

declare @table table(raw_seq int IDENTITY(1,1), col1 varchar(10),col2 varchar(10)); 

затем использовать

ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY raw_seq) AS seq 

Для того, чтобы получить значение, которое вы хотите.

0

Используйте аналитическую функцию row_number().

select 
    col1, 
    col2, 
    row_number() over (partition by col1 order by col1) seq 
from 
    table 
+0

ROW_NUMBER - это аналитическая функция, а не совокупность, - или вам понадобилось бы предложение GROUP BY. – 2010-12-16 01:05:35

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