powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Уникально идентифицировать набор значений
18 сообщений из 43, страница 2 из 2
Уникально идентифицировать набор значений
    #34443529
OraDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно немного другим путем пойти, например чтобы найти набор (1,2):
найти пересечение, т.е. найти все наборы где присутствуют числа и 1 и 2,
а потом из них найти тот набор который содержит два числа.
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34443546
AXAE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OraDenМожно немного другим путем пойти, например чтобы найти набор (1,2):
найти пересечение, т.е. найти все наборы где присутствуют числа и 1 и 2,
а потом из них найти тот набор который содержит два числа.
Проблема в том, что... Хотя можно ли передавать количество чисел? (1,2) - это лишь частный случай. На самом деле в скобках может быть произвольное количество записей.
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34443637
OraDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AXAE OraDenМожно немного другим путем пойти, например чтобы найти набор (1,2):
найти пересечение, т.е. найти все наборы где присутствуют числа и 1 и 2,
а потом из них найти тот набор который содержит два числа.
Проблема в том, что... Хотя можно ли передавать количество чисел? (1,2) - это лишь частный случай. На самом деле в скобках может быть произвольное количество записей.
А как ты, то что в скобках вообще передаешь, если динамически собираешь select
то почему нельзя количество указать? Короче если хочешь четкие ответы, то постарайся
четко описывать что тебе нужно :)
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34443745
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AXAEНаверное опять неправильно объяснил...
Ну хорошо. Тогда что есть и что надо:
Есть таблица со значениями:
Код: plaintext
1.
2.
3.
4.
5.
| i |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |

Мне нужна таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
набор        | вероятность
-------------+---------
(1, 2)       | 0.023
 (3, 5, 4)    | 0.039 
(1, 5)       | 0.31
(5, 3, 1)    | 0.21
(4, 2, 5, 1) | 0.0013
 (4, 3, 5)    | 0.039 
Заметки: помеченные жирным - это строки, у которых вероятность должна быть одинаковой - набор чисел один и тот же. Вероятность никак не связана с самими числами в наборе, только с содержимым набора (не вычисляется, а просто задается).

Каким образом это сделать?
Код: 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.
37.
38.
create table #t1 ( 
  id_t1 int IDENTITY( 1 , 1 ) primary key, s varchar( 100 ) 
)
go
create table #t2 ( 
  id_t2 int primary key,  probability dec(  4 , 3 )
)
go
create table #t3 ( 
  id_t1 int foreign key references #t1,  
  id_t2 int foreign key references #t2
   
  primary key(id_t1, id_t2) 
)
go
--------Заполняем #t1
insert into #t1 (s)
select top  10  name from sysobjects

--------Заполняем #t2
insert into #t2 ( id_t2, probability ) values(  1 ,  0 . 023  )
insert into #t2 ( id_t2, probability ) values(  2 ,  0 . 039  )
insert into #t2 ( id_t2, probability ) values(  3 ,  0 . 31  )

--------Заполняем #t3
--insert sequence (1, 2)
insert into #t3 ( id_t2, id_t1 ) values(  1 ,  1  )
insert into #t3 ( id_t2, id_t1 ) values(  1 ,  2  )

--insert sequence (3, 4, 5)
insert into #t3 ( id_t2, id_t1 ) values(  2 ,  3  )
insert into #t3 ( id_t2, id_t1 ) values(  2 ,  4  )
insert into #t3 ( id_t2, id_t1 ) values(  2 ,  5  )

--insert sequence (1, 5)
insert into #t3 ( id_t2, id_t1 ) values(  3 ,  1  )
insert into #t3 ( id_t2, id_t1 ) values(  3 ,  5  )

Содержимое исходных таблиц:
Код: 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.
select id_t1 from #t1

id_t1       
----------- 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 

select * from #t2

id_t2       probability 
----------- ----------- 
 1            . 023 
 2            . 039 
 3            . 310 

select * from #t3

id_t1       id_t2       
----------- ----------- 
 1             1 
 1             3 
 2             1 
 3             2 
 4             2 
 5             2 
 5             3 
Выборка вероятности для набора (1, 2)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 
  '(1, 2)' as "set",
  MIN(probability) as probability
from 
 #t2 join #t3 on #t2.id_t2 = #t3.id_t2
where
  #t3.id_t1 IN ( 1 ,  2 )
group by #t2.id_t2
having count(*) =  2 

set    probability 
------ ----------- 
( 1 ,  2 ) . 023  

Выборка вероятности для набора (3, 4, 5)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 
  '(3, 4, 5)' as "set",
  MIN(probability) as probability
from 
 #t2 join #t3 on #t2.id_t2 = #t3.id_t2
where
  #t3.id_t1 IN ( 3 ,  4 ,  5 )
group by #t2.id_t2
having count(*) =  3 

set       probability 
--------- ----------- 
( 3 ,  4 ,  5 ) . 039  

Проверка: выборка вероятности для набора (4, 3, 5), т.е. с другим порядком
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 
  '(4, 3, 5)' as "set",
  MIN(probability) as probability
from 
 #t2 join #t3 on #t2.id_t2 = #t3.id_t2
where
  #t3.id_t1 IN ( 4 ,  3 ,  5 )
group by #t2.id_t2
having count(*) =  3 

set       probability 
--------- ----------- 
( 4 ,  3 ,  5 ) . 039  

Выборка вероятности для набора (1, 5)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select 
  '(1, 5)' as "set",
  MIN(probability) as probability
from 
 #t2 join #t3 on #t2.id_t2 = #t3.id_t2
where
  #t3.id_t1 IN ( 1 ,  5 )
group by #t2.id_t2
having count(*) =  2 

set    probability 
------ ----------- 
( 1 ,  5 ) . 310  
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34443993
OraDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to mir

а если добавить:
Код: plaintext
1.
2.
3.
4.
5.
6.
insert into #t2 ( id_t2, probability ) values(  4 ,  0 . 021  )

insert into #t3 ( id_t2, id_t1 ) values(  4 ,  9  )
insert into #t3 ( id_t2, id_t1 ) values(  4 ,  3  )
insert into #t3 ( id_t2, id_t1 ) values(  4 ,  4  )
insert into #t3 ( id_t2, id_t1 ) values(  4 ,  5  )
insert into #t3 ( id_t2, id_t1 ) values(  4 ,  8  )
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34444007
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OraDento mir

а если добавить:
Код: plaintext
1.
2.
3.
4.
5.
6.
insert into #t2 ( id_t2, probability ) values(  4 ,  0 . 021  )

insert into #t3 ( id_t2, id_t1 ) values(  4 ,  9  )
insert into #t3 ( id_t2, id_t1 ) values(  4 ,  3  )
insert into #t3 ( id_t2, id_t1 ) values(  4 ,  4  )
insert into #t3 ( id_t2, id_t1 ) values(  4 ,  5  )
insert into #t3 ( id_t2, id_t1 ) values(  4 ,  8  )
А самому проверить слабО? :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select 
  '(9, 3, 4, 5, 8)' as "set",
  MIN(probability) as probability
from 
 #t2 join #t3 on #t2.id_t2 = #t3.id_t2
where
  #t3.id_t1 IN ( 9 ,  3 ,  4 ,  5 ,  8 )
group by #t2.id_t2
having count(*) =  5 

set             probability 
--------------- ----------- 
( 9 ,  3 ,  4 ,  5 ,  8 ) . 021 

...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34444023
OraDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to mir

а для (3,4,5)?
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34444117
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OraDento mir

а для (3,4,5)?Ага, косяк, поспешил, надо еще подумать.
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34444120
Sgt.Pepper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AXAEНу да, азы проектирования не распишут... Но хоть сказали бы прямо: "эта задача с идентификацией наборов - элементарнейшая и разобрана <линк>"[...]
попробуйте пообщаться с дошкольниками и скажите, что задача умножения натуральных чисел элементарная и приведите им дваждыдва.lnk
p.s. просто мысли вслух без привязки к теме, Ваша задача, действительно, более туманная, но, полагаю, не намного сложнее
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34444181
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, на ходу поправил, но теперь это не лаконично и не очень красиво. Наверняка люди улучшат, надо только подумать.
Но это-таки работает:
Код: 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.
--Выборка вероятности для набора (9, 3, 4, 5, 8)

select
  '(9, 3, 4, 5, 8)' as "set",
  MIN(probability) as probability
from 
( select 
    #t2.id_t2,
    MIN(probability) as probability
  from 
   #t2 join #t3 on #t2.id_t2 = #t3.id_t2
  group by #t2.id_t2
  having count(*) =  5 
) as groups
 join 
 #t3 on groups.id_t2 = #t3.id_t2
where
  #t3.id_t1 IN ( 9 ,  3 ,  4 ,  5 ,  8 )
group by groups.id_t2
having count(*) =  5 


set             probability 
--------------- ----------- 
( 9 ,  3 ,  4 ,  5 ,  8 ) . 021 

Код: 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.
--Выборка вероятности для набора (3, 4, 5)

select
  '(3, 4, 5)' as "set",
  MIN(probability) as probability
from 
( select 
    #t2.id_t2,
    MIN(probability) as probability
  from 
   #t2 join #t3 on #t2.id_t2 = #t3.id_t2
  group by #t2.id_t2
  having count(*) =  3 
) as groups
 join 
 #t3 on groups.id_t2 = #t3.id_t2
where
  #t3.id_t1 IN ( 3 ,  4 ,  5 )
group by groups.id_t2
having count(*) =  3 

set       probability 
--------- ----------- 
( 3 ,  4 ,  5 ) . 039 

И т.д.
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34444189
012345
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mir[quot AXAE]P.S. Просто удивительно, как часто люди, просящие совета, надеются на телепатию читателей, вместо максимально понятной постановки задачи... Или это просто лень?
Просто лень, поэтому надеются на телепатию читателей :)
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34444275
OraDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mirНу, на ходу поправил, но теперь это не лаконично и не очень красиво. Наверняка люди улучшат, надо только подумать.
Но это-таки работает:
Код: 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.
--Выборка вероятности для набора (9, 3, 4, 5, 8)

select
  '(9, 3, 4, 5, 8)' as "set",
  MIN(probability) as probability
from 
( select 
    #t2.id_t2,
    MIN(probability) as probability
  from 
   #t2 join #t3 on #t2.id_t2 = #t3.id_t2
  group by #t2.id_t2
  having count(*) =  5 
) as groups
 join 
 #t3 on groups.id_t2 = #t3.id_t2
where
  #t3.id_t1 IN ( 9 ,  3 ,  4 ,  5 ,  8 )
group by groups.id_t2
having count(*) =  5 


set             probability 
--------------- ----------- 
( 9 ,  3 ,  4 ,  5 ,  8 ) . 021 

Код: 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.
--Выборка вероятности для набора (3, 4, 5)

select
  '(3, 4, 5)' as "set",
  MIN(probability) as probability
from 
( select 
    #t2.id_t2,
    MIN(probability) as probability
  from 
   #t2 join #t3 on #t2.id_t2 = #t3.id_t2
  group by #t2.id_t2
  having count(*) =  3 
) as groups
 join 
 #t3 on groups.id_t2 = #t3.id_t2
where
  #t3.id_t1 IN ( 3 ,  4 ,  5 )
group by groups.id_t2
having count(*) =  3 

set       probability 
--------- ----------- 
( 3 ,  4 ,  5 ) . 039 

И т.д.
Я уже приводил алгоритм в этой же ветке он слегка похож на последний вариант :)
Тынц

Вот он же в коде, в моей редакции (# заменена на A и синтаксис oracle):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT * from AT2 where id_t2 in(
select id_t2 from AT3
where id_t2 in
(
select id_t2 from AT3 where id_t1 =  3  
INTERSECT
select id_t2 from AT3 where id_t1 =  4 
INTERSECT
select id_t2 from AT3 where id_t1 =  5 
)
group by id_t2
having count(*) =  3 )
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34444666
AXAE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обалдеть, сколько мне написали... Буду разбираться, спасибо :)

P.S. Какой смысл твердить новичкам, какие они глупые, ленивые, не умеют поставить вопрос, не хотят искать темы на форумах и т.п.?! Всем ведь не объяснишь, они все равно будут и будут приходить такими - они ведь друг с другом никак не связаны... Этим вы их обижаете, а сами - ничего не получаете от такого обсуждения...((
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34444696
AXAE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оффтопик: Как мне самому-то тяжело разбираться в чужих структурах, запросах, мыслях... С первого взгляда ничего не понял:
'(1, 5)' as "set", - ни что такое <as "set">
MIN(probability) as probability - ни почему MIN(probability)
having count(*) = 2 - ни что такое having
group by #t2.id_t2 - и проблемы с пониманием, как действует GROUP

Но это уже мои проблемы - структура данных вполне отвечает задаче (спасибо Мелани)... Буду разбираться :)
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34444963
AXAE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
012345 mir[quot AXAE]P.S. Просто удивительно, как часто люди, просящие совета, надеются на телепатию читателей, вместо максимально понятной постановки задачи... Или это просто лень?
Просто лень, поэтому надеются на телепатию читателей :)
Вы, видать, из тех, кто считает, что хорошо поставленный вопрос будет стоять там еще долго, а не из тех, кто считает, что хорошо поставленный вопрос заключает в себе ответ
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34444974
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OraDen
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT * from AT2 where id_t2 in(
select id_t2 from AT3
where id_t2 in
(
select id_t2 from AT3 where id_t1 =  3  
INTERSECT
select id_t2 from AT3 where id_t1 =  4 
INTERSECT
select id_t2 from AT3 where id_t1 =  5 
)
group by id_t2
having count(*) =  3 )
Я бы заменил в первой строке
Код: plaintext
SELECT * from AT2 where id_t2 in (
на
Код: plaintext
SELECT * from AT2 where id_t2 = (
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34445033
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой финальный (чуть улучшенный) вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select * from #t2 
where id_t2 = 
(
  select groups.id_t2 from #t3
  join 
  ( select id_t2
      from #t3
      group by id_t2
      having count(*) =  3  --ЧИСЛО ЗНАЧЕНИЙ СПИСКА
    ) as groups
    on groups.id_t2 = #t3.id_t2
  where
    #t3.id_t1 IN ( 3 ,  4 ,  5 ) --СПИСОК
  group by groups.id_t2
  having count(*) =  3  --ЧИСЛО ЗНАЧЕНИЙ СПИСКА
)
Мой вариант, кстати можно применить и без динамического SQL, если СПИСОК берется из какой-то таблицы (запроса), т.е. вместо in (3, 4, 5) будет стоять in (select ...) . Параметр ЧИСЛО ЗНАЧЕНИЙ СПИСКА может передаваться как параметр запроса.
...
Рейтинг: 0 / 0
Уникально идентифицировать набор значений
    #34450721
Melani
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AXAE структура данных вполне отвечает задаче (спасибо Мелани)...

пожалуйста :)

AXAE
Оффтопик: Как мне самому-то тяжело разбираться в чужих структурах, запросах, мыслях... С первого взгляда ничего не понял:
'(1, 5)' as "set", - ни что такое <as "set">
MIN(probability) as probability - ни почему MIN(probability)
having count(*) = 2 - ни что такое having
group by #t2.id_t2 - и проблемы с пониманием, как действует GROUP

Но это уже мои проблемы -... Буду разбираться :)


эх ты, основ языка SQL не знаешь. Читай, пробуй, развивайся!!
...
Рейтинг: 0 / 0
18 сообщений из 43, страница 2 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Уникально идентифицировать набор значений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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