Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / побитовое ИЛИ (OR) / 7 сообщений из 7, страница 1 из 1
03.10.2002, 15:53:17
    #32055204
побитовое ИЛИ (OR)
Здравствуйте всем!

След. проблема
есть таблица
ID | Value
81 | 1
81 | 7
82 | 5
81 | 3

Необходимо на выходе получить
ID | Value
81 | 7
82 | 5

То есть
1. Сгруппировать по ID
2. А для значений произвести побитовое ИЛИ (OR)

Подскажите пожалуста, как это можно сделать без курсоров.
Как сделать на курсорах я сам знаю.

Дмитрий
...
Рейтинг: 0 / 0
03.10.2002, 16:07:37
    #32055209
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
побитовое ИЛИ (OR)
а сервер sql 2000?
...
Рейтинг: 0 / 0
03.10.2002, 16:11:32
    #32055214
побитовое ИЛИ (OR)
Извините забыл
SQL 2000
...
Рейтинг: 0 / 0
03.10.2002, 16:34:12
    #32055234
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
побитовое ИЛИ (OR)
1. Написать функцию, которая бы давала считала OR для конкретного ID. Написать можно по принципу select @V=@V OR Value from tbl where ID=@ID

2.Для любителей извращений:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @t table( id int, value int)
insert @t select  81 ,  1  union select  81 ,  7  union select  82 ,  5  union select  81 ,  3 

select * from @t

select id,  8 *(case when sum(value &  8 )> 0  then  1  else  0  end)+
            4 *(case when sum(value &  4 )> 0  then  1  else  0  end)+  
            2 *(case when sum(value &  2 )> 0  then  1  else  0  end)+  
            1 *(case when sum(value &  1 )> 0  then  1  else  0  end) 
from @t group by id

естественно это будет работать с числами меньше 16. Иначе нужно количество строчек увеличивать до количества бит в сравниваемом числе
...
Рейтинг: 0 / 0
03.10.2002, 16:43:24
    #32055246
побитовое ИЛИ (OR)
genial'no !!!!!

Spasibo ogromnoe !!!
...
Рейтинг: 0 / 0
03.10.2002, 16:56:31
    #32055256
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
побитовое ИЛИ (OR)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table t (id int ,val int)
insert into #t
select  81 , 1 
union all 
select  81 , 7  
union all 
select  82 , 5  
union all 
select  81 , 3 

create function dbo.myfunc( @id int)
returns int
as 
begin
  declare @i int
  select @i=isnull(@i, 0 )|val from t where id=@id
  return @i
end
go
select didtinct id,dbo.myfunc(id) val
from t
...
Рейтинг: 0 / 0
03.10.2002, 17:58:49
    #32055278
akuz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
побитовое ИЛИ (OR)
Из разряда очевидное-невероятное (для любителей извращений :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
create table #t (
  id int,
  value int
)

insert into #t values ( 81 , 2 )
insert into #t values ( 81 , 6 )
insert into #t values ( 82 , 5 )
insert into #t values ( 81 , 3 )

declare @id int, @value int

select id, value 
into #t1
from #t
order by id, value

set @value =  0 
set @id =  0 

select * from #t

update #t1 set
	#t1.value = @value,
	@value = CASE @id WHEN #t1.id THEN @value | t.value ELSE t.value END ,
	@id = #t1.id
from #t t
where t.id = #t1.id
	and t.value = #t1.value

select id, max(value)
from #t1
group by id

drop table #t
drop table #t1

Но зато никаких подселектов, хотя вариант MiCe мне больше нравится. Попробуйте на миллионе записей, сравните производительность.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / побитовое ИЛИ (OR) / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]