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

Откуда: Москва
Сообщений: 19
Друзья!
Вот какая проблема.
Есть 2 таблицы
Таблица1(ID)
Таблица2(ID, ID_Таблица1,НомерГруппы)

Данные:
Таблица1 (1,2,3,4,5)
Таблица2
1,1,1
2,2,1
3,3,2
4,1,3
5,2,3
6,3,3
7,1,4
8,4,4
9,1,5
10,5,5

То есть, во второй таблице содержаться группы идентификаторов из первой.

(1,2) - 1 я группа
(3) - 2 я группа
(1,2,3) - 3 я группа
(1,4) - 4 я группа
(1,5) - 5 я группа

Номера групп - это третий столбец.
Группы могут быть произвольной длинны.
Я указал в примере 1,2 или 3 идентификатора.
Но вообще их количество может быть произвольным.

Итак задача. Известны идентификаторы из таблицы 1.
Найти номера всех групп, куда эти идентификаторы входят полностью,
ну как бы покрывают группу.
Пример:
Пусть даны идентификаторы
из 1-й таблицы: 1,2,3. Подходят группы
1 - там есть 1 и 2,
2 - там есть 3
и 3 - там есть 1,2,3.
4-я и 5-я группы не подходят, потому что ID=4 и ID=5
в начальном условии нет, хотя есть 1.
Еще один пример.
Пусть даны идентификаторы 1,2,4.
Для них подходят группы 1-я и 4-я.
Понятно ли объяснил?
Как построить такой запрос?
13 авг 12, 17:55    [13005580]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
Yuriy Petrov
Member

Откуда:
Сообщений: 91
wizzard2009
Друзья!
Вот какая проблема.
Есть 2 таблицы
Таблица1(ID)
Таблица2(ID, ID_Таблица1,НомерГруппы)

Данные:
Таблица1 (1,2,3,4,5)
Таблица2
1,1,1
2,2,1
3,3,2
4,1,3
5,2,3
6,3,3
7,1,4
8,4,4
9,1,5
10,5,5

То есть, во второй таблице содержаться группы идентификаторов из первой.

(1,2) - 1 я группа
(3) - 2 я группа
(1,2,3) - 3 я группа
(1,4) - 4 я группа
(1,5) - 5 я группа

Номера групп - это третий столбец.
Группы могут быть произвольной длинны.
Я указал в примере 1,2 или 3 идентификатора.
Но вообще их количество может быть произвольным.

Итак задача. Известны идентификаторы из таблицы 1.
Найти номера всех групп, куда эти идентификаторы входят полностью,
ну как бы покрывают группу.
Пример:
Пусть даны идентификаторы
из 1-й таблицы: 1,2,3. Подходят группы
1 - там есть 1 и 2,
2 - там есть 3
и 3 - там есть 1,2,3.
4-я и 5-я группы не подходят, потому что ID=4 и ID=5
в начальном условии нет, хотя есть 1.
Еще один пример.
Пусть даны идентификаторы 1,2,4.
Для них подходят группы 1-я и 4-я.
Понятно ли объяснил?
Как построить такой запрос?

Если правильно понял условие, то вот...
declare @t1 table (ID int)
declare @t2 table (ID int, ID_t1 int, grp int)
declare @target table (ID int)

insert into @t1
select 1 as [id] union all select 2 union all select 3 union all select 4 union all select 5

insert into @t2
select 1 as [id], 1 as [id_t1], 1 as [grp]
union all
select 2, 2, 1
union all
select 3, 3, 2
union all
select 4, 1, 3
union all
select 5, 2, 3
union all
select 6, 3, 3
union all
select 7, 1, 4
union all
select 8, 4, 4
union all
select 9, 1, 5
union all
select 10, 5, 5

insert into @target
select 1 as [id] union all select 2 union all select 4

select * from @t1
select * from @t2
select * from @target

;with
cte as (
	select *,
			COUNT (*) over (partition by grp) as [cnt_grp]
	  from @t2
)
select grp
  from cte
 where exists (select * from @target t where t.ID = cte.ID_t1)
 group by grp
having COUNT (*) = min (cnt_grp)
13 авг 12, 19:20    [13005949]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Yuriy Petrov, 1,2,6 - не работает

WITH Own AS (SELECT * FROM (VALUES 
	 (1,1)
	,(2,1)
	,(3,2)
	,(1,3)
	,(2,3)
	,(3,3)
	,(1,4)
	,(4,4)
	,(1,5)
	,(5,5)
	) T(Obj,Grp)
), Q AS (SELECT * FROM (VALUES
	 (1)
	,(2)
	,(3)
--	,(4)
--	,(6)
	)T(Obj)
), R AS (
	SELECT	 Q.Obj
		,O.Grp
		,Count(CASE WHEN O.Obj IS NULL THEN 1 END)OVER()			AS NotAll
		,Count(CASE WHEN Q.Obj IS NULL THEN 1 END)OVER(PARTITION BY O.Grp)	AS HasOther
	FROM	          Q	Q
		FULL JOIN Own	O ON O.Obj = Q.Obj
)	SELECT	DISTINCT Grp
	FROM	R
	WHERE	    NotAll	= 0
		AND HasOther	= 0
13 авг 12, 19:50    [13006022]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
wizzard2009
Member

Откуда: Москва
Сообщений: 19
Собственно вот ответ
SELECT DISTINCT НомерГруппы
FROM Таблица2 WHERE
НомерГруппы NOT IN (
SELECT distinct НомерГруппы
FROM Таблица2
WHERE ID_Таблица1 NOT IN (1,2,3,4))
14 авг 12, 07:53    [13007042]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
wizzard2009
WITH Own AS (SELECT * FROM (VALUES 
	 (1,1)
	,(2,1)
	,(3,2)
	,(1,3)
	,(2,3)
	,(3,3)
	,(1,4)
	,(4,4)
	,(1,5)
	,(5,5)
	) T(Obj,Grp)
)	SELECT	DISTINCT Grp
	FROM	Own	A
	WHERE	NOT Exists (
		SELECT	*
		FROM	Own	B
		WHERE	    B.Grp = A.Grp
			AND B.Obj NOT IN (1,3))
Для случая 1,3 у вас тоже не работает. (выдаёт 2)
14 авг 12, 09:30    [13007258]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
Yuriy Petrov
Member

Откуда:
Сообщений: 91
Mnior
Yuriy Petrov, 1,2,6 - не работает

А почему не работает?
Ответ моего кода - 1.
Разве это неправильный ответ?
14 авг 12, 12:41    [13008404]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Yuriy Petrov
Разве это неправильный ответ?
wizzard2009
Найти номера всех групп, куда эти идентификаторы входят полностью, ну как бы покрывают группу.
Если нет решений, значит нет решений.
14 авг 12, 13:09    [13008557]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
wizzard2009
Найти номера всех групп, куда эти идентификаторы входят полностью,
ну как бы покрывают группу.
Так входят или покрывают? Потому что, кроме этой фразу, все ваши пояснения даны для случая не когда идентификаторы полностью входят в группу, а наоборот, группа полностью входит в множество идентификаторов.
14 авг 12, 13:26    [13008638]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
Yuriy Petrov
Member

Откуда:
Сообщений: 91
Mnior
Yuriy Petrov
Разве это неправильный ответ?
wizzard2009
Найти номера всех групп, куда эти идентификаторы входят полностью, ну как бы покрывают группу.
Если нет решений, значит нет решений.

Я думаю, что "полностью" у автора означало "нет иных".
Так 1,2,6 покрывает 1ю группу (1,2) и при этом в 1й группе нет иных идентификаторов, в общем все как в примере у автора
автор
Пусть даны идентификаторы 1,2,4.
Для них подходят группы 1-я и 4-я.

Ни 1-я ни 4-я группы не содержат и 1 и 2 и 4 идентификаторы, но 1-я это 1,2, а 4-я это 1,4.
Вот мой код на 1,2,6 и выводит 1ю группу.

П.С. И вообще, где автор?!!! :)
Может он хотел получить то, что возвращает его код? :)
14 авг 12, 13:28    [13008662]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Yuriy Petrov
Я думаю, что "полностью" у автора означало "нет иных".
wizzard2009
Найти номера всех групп, куда эти идентификаторы входят полностью, ну как бы покрывают группу.


Yuriy Petrov, по вашему любое подмножество автоматически становится решением, т.е. как бы существует несколько решений.
Но:
wizzard2009
Пусть даны идентификаторы: 1,2,3.
Подходят группы 1, 2:
1. в 1й есть 1 и 2,
2. во 2й есть 3
3. там есть все элементы 1,2,3
14 авг 12, 15:15    [13009666]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Mnior
по вашему любое подмножество автоматически становится решением, т.е. как бы существует несколько решений.
А мы ищем не подмножество, а группы, которые бы в него входили. Вот набор этих групп и будет единственным решением для заданного подмножества.
14 авг 12, 15:32    [13009842]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
Yuriy Petrov
Member

Откуда:
Сообщений: 91
Mnior
Yuriy Petrov
Я думаю, что "полностью" у автора означало "нет иных".
wizzard2009
Найти номера всех групп, куда эти идентификаторы входят полностью, ну как бы покрывают группу.


Yuriy Petrov, по вашему любое подмножество автоматически становится решением, т.е. как бы существует несколько решений.
Но:
wizzard2009
Пусть даны идентификаторы: 1,2,3.
Подходят группы 1, 2:
1. в 1й есть 1 и 2,
2. во 2й есть 3
3. там есть все элементы 1,2,3

:) Э-э нет, вы неправильно процитировали (ну и наверно поняли) автора, было сказано:
автор
Пусть даны идентификаторы
из 1-й таблицы: 1,2,3. Подходят группы
1 - там есть 1 и 2,
2 - там есть 3
и 3 - там есть 1,2,3.
Т.е. подходят группы 1, 2, 3.
Мое решение возвращает что-то иное?

Ну и имхо SomewhereSomehow прав :)
14 авг 12, 15:54    [13010019]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SomewhereSomehow
Mnior
по вашему любое подмножество решения, также становится решением, т.е. как бы существует несколько решений.
А мы ищем не подмножество, а группы, которые бы в него входили. Вот набор этих групп и будет единственным решением для заданного подмножества.
Кхм. Вам видимо делать нечего. Мы опять друг друга не поняли.

Группы {1,2} есть решение для элементов 1,2,3.
По логике Yuriy Petrov два подмножества {1} и {2} также отдельные решения, группы {1} есть решение для 1,2,3, а также {2} тоже решение для 1,2,3
ТС этого не писал.
------------------------------------------------------------------
Yuriy Petrov
вы неправильно процитировали (ну и наверно поняли) автора
Частично неправильно ответил вам на последний пост - не то процитировал. Ссори.

У для элементов 1,2,3 решение: группы {1,2,3}
wizzard2009
Найти номера всех групп, куда эти идентификаторы входят полностью, ну как бы покрывают группу.
Решение всегда одно.

Куда? - в группы
Кто? - эти, означают данный по условию элементы 1,2,3
Они должны входить в группы полностью, т.е. присутствовать и 1 и 2 и 3 в найденых группах.
Для 1,2,6 - 6 не найдено в указанных группах.

В принципе согласен, если изменить предложение.
"Найти номера всех групп, элементы которых входят полностью в этот список, ну как бы покрывают группу."
Но тогда в данной фрезе ничего не сказано об идентификаторах которые не входят в список.
В исходном предложение всё довольно однозначно сказано и про решение, и про взаимное покрытие.

Но более того, вы продолжаете игнорировать:
Mnior
Для случая 1,3 у вас тоже не работает. (выдаёт 2)
14 авг 12, 18:03    [13010866]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Mnior
Кто? - эти, означают данный по условию элементы 1,2,3
Они должны входить в группы полностью, т.е. присутствовать и 1 и 2 и 3 в найденых группах.
Для 1,2,6 - 6 не найдено в указанных группах.

По-моему, автор просто описался в одной фразе что куда входит(правда потом поправился, что идентификаторы покрывают группу), а вы в очередной раз тупите, т.к. дальнейшее объяснение говорит:
автор
Пусть даны идентификаторы
из 1-й таблицы: 1,2,3.
Таблица2
(1,2) - 1 я группа
(3) - 2 я группа
(1,2,3) - 3 я группа
(1,4) - 4 я группа
(1,5) - 5 я группа

Если это множество должно быть включено в группу, то подходит только группа 3.
Но автор сообщает нам:
автор
Подходят группы
1 - там есть 1 и 2,
2 - там есть 3
и 3 - там есть 1,2,3.

Так что для приведенного выше примера, по такой логике:
например 6-ая группа из одного элемента (1) тоже должна была бы быть выбрана, 7-ая из одного элемента (2), тоже.

Я бы сформулировал задачу просто, пусть дано множество:
A = {1,2,3} и множества A1 ={1,2}, A2 ={3}, A3 = {1,2,3}, A4 ={1,4}, A5 = {1,5}, требуется найти все множества Ai которые будут включены в A. Надеюсь, сейчас вы меня поняли?
14 авг 12, 18:45    [13011064]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
wizzard2009
Member

Откуда: Москва
Сообщений: 19
Я очень сильно поломал себе голову, над тем, КАК объяснить задачу.
Действительно, последнее приведенное объяснение точно описывает суть дела:
A = {1,2,3} и множества A1 ={1,2}, A2 ={3}, A3 = {1,2,3}, A4 ={1,4}, A5 = {1,5}, требуется найти все множества Ai которые будут включены в A.
Всем спасибо!
З.Ы. Я и не думал, что такая полемика развернется.
14 авг 12, 19:30    [13011253]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать группы?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
OffTop

SomewhereSomehow
Если это множество должно быть включено в группу, то подходит только группа 3.
Не в группу, а в группы:
wizzard2009
Найти номера всех групп, куда эти идентификаторы входят полностью, ну как бы покрывают группу.
Куда - в группы (множественное число) целиком, а не по отдельности.
Если было написано: "Найти номера всех групп, для каждой из которых эти идентификаторы входят полностью ...", тогда да.
Или "Найти номера тех групп, в которых эти идентификаторы входят полностью ...". Но увы, тут не однозначно.
Поэтому берётся оставшаяся интерпретация, с предположением что автор возможно не ошибся.
Вы должны показать, что моя интервпретация не имееи смысл или не вписывается в формулировку, либо признать что она всётаки имеет смысл.

SomewhereSomehow
По-моему, автор просто описался в одной фразе
В слове "хлеб" было допущено 4 ошибки - "пиво".
До последнего поста TC нет никаких однозначных развеений многочтений. Даже 13007042 можно интерпретирвать как найденное неправильное решение - мало ли.

SomewhereSomehow, вся немощность в том что вы не можете сказать словами в чём ошибка. Вы можете решать правильно, но плохо формулируете решение. Вы даже не смогли указать на то, что связка "ну" кагбе может намекать на повторность формулирования смысла. (хотя я здесь мог свободно отмазаться - опечатка в одной букве) Это первое.

Второе. То что я увидел валидную задачу в указанном посте может говорить лишь:
а) я возможно ошибся - и эта задача невозможна в принципе или не вписывается в формулировку. Но это не было показано.
б) или кто-то банально не смог увидеть в первоначальной задаче валидную интерпретацию.

И третье, то что я решил задачу сформулированную в первом посте, не имеет право разбрасываться словами:
"вы неправильно поняли", "вы в очередной раз тупите" (хотя тупит в основном SomewhereSomehow)
Хотя, горячий финский парень SomewhereSomehow, видимо реагирует на Mnior как на красную тряпку. Поменьше эмоций дарагой мой.
Хотя это действует иногда положительно ...

SomewhereSomehow, я не могу спорить с тем, что я пытаюсь быть точен к сказанному, а не что "имелось ввиду". Не по простой "придирке", а к тому, что правильный результат не доказывает правильность решения. Ну такой уж я дотошный.
+ Арихметика


Peace
15 авг 12, 01:36    [13012403]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить