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

Откуда:
Сообщений: 20
Добрый вечер. Ребята, будьте добры, помогите оптимизировать запрос.

Исходные данные
create table #temmm (
	[Flex ID] [bigint] NULL,
	[Storno] [tinyint] NULL
	)
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000009','1')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000009','0')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000018','0')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000018','0')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000018','0')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000018','0')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000011','1')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000011','1')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000011','0')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000011','0')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000012','1')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000012','1')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000012','1')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000015','0')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000015','0')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000015','0')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000015','0')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000016','1')
insert into #temmm ([Flex ID], [Storno]) VALUES ('1703000000011','1')


Требуется
Выбрать данные из таблицы #temmm где [Flex ID] одинаковый, а [Storno] разное.


Я смог справиться только через временную таблицу. Но в реальной таблице очень много строк. Помогите оптимизировать или ссылку где почитать. Спасибо.


Мое решение
if object_id('tempdb..#erwer') is not null
  drop table #erwer

SELECT [Flex ID], [Storno] INTO #erwer
FROM #temmm
GROUP BY [Flex ID], [Storno]

SELECT [Flex ID], [storno] from #erwer where [Flex ID] in
(select [Flex ID] from #erwer
GROUP BY [Flex ID]
HAVING COUNT ([Flex ID])>1)
19 май 12, 21:09    [12582647]     Ответить | Цитировать Сообщить модератору
 Re: Будьте добры, помогите оптимизировать запрос  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Может я чего не понял.
"Выбрать данные из таблицы #temmm где [Flex ID] одинаковый, а [Storno] разное."

select * from  #temmm A 
inner join #temmm B on A.[Flex ID] = B.[Flex ID] and  A.[Storno] <> B. [Storno]

Можно допилить, distinct написать.
19 май 12, 22:23    [12582928]     Ответить | Цитировать Сообщить модератору
 Re: Будьте добры, помогите оптимизировать запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
declare @t table  (
	[Flex ID] [bigint] NULL,
	[Storno] [tinyint] NULL
	);
	
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000009','1');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000009','0');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000018','0');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000018','0');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000018','0');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000018','0');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000011','1');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000011','1');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000011','0');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000011','0');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000012','1');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000012','1');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000012','1');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000015','0');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000015','0');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000015','0');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000015','0');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000016','1');
insert into @t ([Flex ID], [Storno]) VALUES ('1703000000011','1');

with cte as
(
 select
  [Flex ID], [Storno],
  count(*) over (partition by [Flex ID]) as c1,
  count(*) over (partition by [Flex ID], [Storno]) as c2,
  row_number() over (partition by [Flex ID], [Storno] order by [Storno]) as n
 from
  @t
)
select
 [Flex ID], [Storno]
from
 cte
where
 c1 <> c2 and n = 1;
19 май 12, 23:08    [12583132]     Ответить | Цитировать Сообщить модератору
 Re: Будьте добры, помогите оптимизировать запрос  [new]
Anton_SQL_RU
Member

Откуда:
Сообщений: 20
Deff, invm, спасибо большое.
19 май 12, 23:37    [12583287]     Ответить | Цитировать Сообщить модератору
 Re: Будьте добры, помогите оптимизировать запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Anton_SQL_RU,

Вот так будет правильнее, в один скан:
with cte as
(
 select
  [Flex ID], [Storno],
  row_number() over (partition by [Flex ID], [Storno] order by [Storno]) as n,
  rank() over (partition by [Flex ID] order by [Storno]) as r1,
  rank() over (partition by [Flex ID] order by [Storno] desc) as r2
 from
  @t
)
select
 [Flex ID], [Storno]
from
 cte
where
 n = 1 and r1 <> r2;
20 май 12, 10:39    [12583953]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить