Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 запрос с нумерацией  [new]
Erik_Kartmann
Member

Откуда: Пиндырдышханда
Сообщений: 948
допустим есть что-то вида

автор
1, 'Иванов', 'Ваня'
2, 'Петров', 'Петя'
3, 'Иванов'
4, 'зильберштейн', 'Давид'
5, 'Петров', 'Петя'


Как сделать что-то вида:
автор
1, 'Иванов', 'Ваня'
3, NULL, NULL
2, 'Петров' , 'Петя'
5, NULL, NULL
4, 'зильберштейн', 'Давид'


ну, тоесть взять, и занулить дубликаты?

---------------------------------------------------------
SET @@verSION = 'Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Workgroup Edition on Windows NT 5.2 (Build 3790: Service Pack 1) '
1 окт 09, 11:13    [7728529]     Ответить | Цитировать Сообщить модератору
 Re: запрос с нумерацией  [new]
Добрый Э - Эх
Guest
exists-подзапрос (для зануления дублей) + ROW_NUMBER() (для правильной сортировки) тебе в помощь
1 окт 09, 11:16    [7728540]     Ответить | Цитировать Сообщить модератору
 Re: запрос с нумерацией  [new]
Добрый Э - Эх
Guest
кстати, row_number - в топку...
1 окт 09, 11:22    [7728564]     Ответить | Цитировать Сообщить модератору
 Re: запрос с нумерацией  [new]
Добрый Э - Эх
Guest
Примерно вот так:
with
  t (id, surname, name) as 
    (
      select 1, 'Иванов', 'Ваня' union all
      select 2, 'Петров', 'Петя' union all
      select 3, 'Иванов' , null union all
      select 4, 'зильберштейн', 'Давид' union all
      select 5, 'Петров', 'Петя'
    )
select id, 
       case flag 
         when 1 then surname 
       end surname,
       case flag 
         when 1 then name 
       end name
  from (
         select id, surname, name,
                min(id) over(partition by surname) as min_id,
                case 
                  when not exists(
                                   select null from t t1
                                    where t1.surname = t.surname
                                      and t1.id < t.id
                                 ) then 1 
                end as flag
           from t
      ) as v          
order by v.min_id, v.surname, id
idsurnamename
1ИвановВаня
3NULLNULL
2ПетровПетя
5NULLNULL
4зильберштейнДавид
1 окт 09, 11:27    [7728593]     Ответить | Цитировать Сообщить модератору
 Re: запрос с нумерацией  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
Erik_Kartmann,

WITH a (i,f,n) AS(
	SELECT 1, 'Иванов', 'Ваня'
	UNION ALL SELECT 2, 'Петров', 'Петя'
	UNION ALL SELECT 3, 'Иванов', null
	UNION ALL SELECT 4, 'зильберштейн', 'Давид'
	UNION ALL SELECT 5, 'Петров', 'Петя'
)

SELECT
*
,CASE WHEN row_number() OVER(partition BY f ORDER BY i)>1 THEN NULL ELSE n END 'Вариант 1'
,CASE WHEN EXISTS(SELECT 1 FROM a b where a.i>b.i AND a.f=b.f) THEN NULL ELSE n END 'Вариант 2'
FROM a
1 окт 09, 11:33    [7728627]     Ответить | Цитировать Сообщить модератору
 Re: запрос с нумерацией  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
ну-у... для разнообразия вариантов, ещё один:
if object_id('tempdb..#t') is not null drop table #t

create table #t
(
id tinyint,
n1 varchar(15),
n2 varchar(15)
)

insert #t
select 1, 'Иванов', 'Ваня'
union all
select 2, 'Петров', 'Петя'
union all
select 3, 'Иванов', null
union all
select 4, 'зильберштейн', 'Давид'
union all
select 5, 'Петров', 'Петя'

select
t1.id
,case when t2.id is null then t1.n1 end
,case when t2.id is null then t1.n2 end
from
#t t1
left join #t t2 on t2.n1 = t1.n1 and t2.id < t1.id
--------------------------------------------------------------
Дьявол кроется в деталях.
1 окт 09, 11:37    [7728649]     Ответить | Цитировать Сообщить модератору
 Re: запрос с нумерацией  [new]
Erik_Kartmann
Member

Откуда: Пиндырдышханда
Сообщений: 948
Большое спасибо! ;)
---------------------------------------------------------
SET @@verSION = 'Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Workgroup Edition on Windows NT 5.2 (Build 3790: Service Pack 1) '
1 окт 09, 11:47    [7728724]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить