2013-12-11 4 views
0

У меня есть таблица, как идентификатор, CategoryId и выборки данных, какКак получить идентификатор последовательности для каждой группы при выборе - в sql server 2000?

 id categoryid 
     1  74 
     2  74 
     3  75 
     4  75 
     5  76 
     6  76 

этого.

Я хочу, чтобы в результате получился набор данных, как показано ниже.

 id categoryid row 
     1  74  1 
     2  74  1 
     3  75  2 
     4  75  2 
     5  76  3 
     6  77  4 

Может ли кто-нибудь помочь мне в этом. любой ответ будет благодарен.

+0

Откуда взялась категория 77? Вы хотели поставить 77 в данные образца? – hvd

+0

Что вы еще пробовали? Какой учебник или документацию вы не могли понять, чтобы мы могли помочь вам понять? –

+0

Извините за ошибки, 77 - это еще одна категория, которую я должен был бы упомянуть в данных образца. – Waliullah

ответ

1
create table #tmp (id int, categoryid int) 
create table #categoryid (categoryid int, sequencenumber int identity(1,1)) 

insert into #tmp values (1,74) 
insert into #tmp values (2,74) 
insert into #tmp values (3,75) 
insert into #tmp values (4,75) 
insert into #tmp values (5,76) 
insert into #tmp values (6,77) 

insert into #categoryid (categoryid) 
select distinct categoryid 
from #tmp 
order by categoryid 

select t.id, t.categoryid, c.sequencenumber 
from #tmp t 
join #categoryid c 
    on t.categoryid = c.categoryid 

Это удивительно, как быстро мы забываем, как жизнь была до ROW_NUMBER() ... это не может быть лучшим ответом, но это первый один поп в моей голове. Повеселись!

+0

Я не думаю, что 'INSERT INTO' ...' SELECT' ... 'ORDER BY' гарантирует, что вы получите идентификационные значения в указанном порядке. Учитывая, что вопрос конкретно задает вопрос о SQL Server 2000, где он будет работать, это может быть хорошо, но стоит отметить, так как это может помешать обновлению на более позднем этапе более поздней версии SQL Server. – hvd

+0

@hvd, я извиняюсь за свое невежество ... Я никогда не видел, чтобы это не работало и, естественно, предполагалось, когда что-то заказывается .. тогда вставлено ... это сработает. Вы говорите мне, что это не всегда будет работать в SQL 2008/2012. Для моего образования .. знаете ли вы о какой-либо документации/блоге, которая показывает это? Благодарю. –

+0

В общем, отсутствие явного обещания в документации означает, что вы не можете полагаться на нее. Тем не менее, похоже, что в этом случае я, возможно, говорил слишком рано, так как [Microsoft специально зарегистрировала это] (http://support.microsoft.com/kb/273586) (поскольку статья в KB считается документацией). Итак, +1 для вас. – hvd

1

В SQL Server 2000 для этого нет встроенной поддержки. Более новые версии SQL Server поддерживает это с помощью функции DENSE_RANK():

select id, categoryid, dense_rank() over (order by categoryid) from sample; 

, но это должно быть эмулировать, чтобы получить то, что работает на 2000 тоже. По существу, число строк - это количество различных категорий (включая текущий), которые были представлены до сих пор, и это легко выразить:

select id, categoryid, (
    select count(distinct categoryid) 
    from sample as sub 
    where categoryid <= sample.categoryid) 
from sample; 
+0

хороший ответ !!!! –

+0

спасибо всем за ответ на мою проблему. – Waliullah

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