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

Откуда:
Сообщений: 271
Интересно бы посмотреть решение этой задачи.
Картинка с другого сайта.
17 июл 15, 17:53    [17905538]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4539
Sliva, сколько?
17 июл 15, 17:59    [17905565]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
0-0
Guest
Sliva,

что не получилось в решении?
Выкладывайте свой вариант, обсудим
17 июл 15, 18:01    [17905575]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
Sliva
Member

Откуда:
Сообщений: 271
0-0,

знакомый меня троллит))
Я даже не знаю как к ней подступиться.
Кода нет. Мысль такая, временная таблица.
Пакет | Канал
--------------
1 | А
2 | B
3 | C
4 | D
5 | A
5 | B
6 | A
6 | C
-//-//-//-//-//
По сути таблица многие ко многим пакеты и каналы.
P.S. может я выбрал не верное направление.
17 июл 15, 18:16    [17905622]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
Условие недоопределено. Может ли один канал входить в несколько пакетов? Может ли один телевизор быть связан с несколькими пакетами?
17 июл 15, 18:42    [17905686]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
Sliva
Member

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

1-да, 2-как я понял из условия это не важно.
17 июл 15, 18:50    [17905707]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Akina
Может ли один телевизор быть связан с несколькими пакетами?


нет, не может, потому что набор каналов одного телевизора - это один пакет по определению.

P.S. Задача несложная.
17 июл 15, 18:56    [17905714]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
Добрый Э - Эх
Guest
Sliva,

классичесчкая задача на реляционное деление. решается в общем случае через group by + having, либо на [not]exiats-подзапросах
20 июл 15, 12:29    [17912196]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2392
Блог
Кот Матроскин
Akina
Может ли один телевизор быть связан с несколькими пакетами?


нет, не может, потому что набор каналов одного телевизора - это один пакет по определению.

P.S. Задача несложная.
Не факт, несколько пакетов с перекрытием по каналам вполне возможный кейс. Тогда задачка делается интересней, помимо банального реляционного деления возникает задачка о рюкзаке.
20 июл 15, 13:00    [17912411]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
zasandator
Member [скрыт] [заблокирован]

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

Собеседка в ТНС?))))
20 июл 15, 13:13    [17912486]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Павел Воронцов
Кот Матроскин
пропущено...


нет, не может, потому что набор каналов одного телевизора - это один пакет по определению.

P.S. Задача несложная.
Не факт, несколько пакетов с перекрытием по каналам вполне возможный кейс.


С точки зрения залачи он не важен.
Да, потенциально может быть ситуация пакетов ((A, B), (B, С), (А, B, С)) - но с точки зрения задачи третий телевизор связан не с двумя пакетами (A, B) и (B, C), а с одним пакетом (A, В, С).
20 июл 15, 13:17    [17912509]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2392
Блог
Кот Матроскин
Павел Воронцов
пропущено...
Не факт, несколько пакетов с перекрытием по каналам вполне возможный кейс.


С точки зрения залачи он не важен.
Да, потенциально может быть ситуация пакетов ((A, B), (B, С), (А, B, С)) - но с точки зрения задачи третий телевизор связан не с двумя пакетами (A, B) и (B, C), а с одним пакетом (A, В, С).
Вопрос как определяется "уникальный набор пакетов". Если есть два других телевизора, подписанных на (A,B) и (B,C) соответственно, пакет (A,B,C) будет излишним.
20 июл 15, 13:45    [17912741]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Исходя из условия "Каждый телевизор принимает какой-то один пакет каналов", нужно определить к какому пакету относится конкретная строка таблицы.
Это можно сделать надежным и ненадежным способом:
declare @t table (tv int, ch char(1));

insert into @t
values
 (1 , 'A'),
 (1 , 'C'),
 (2 , 'B'),
 (3 , 'C'),
 (4 , 'D'),
 (5 , 'A'),
 (5 , 'B'),
 (6 , 'A'),
 (6 , 'C');

/*Ненадежно*/
select
 *,
 checksum_agg(checksum(ch)) over (partition by tv) as pkg
from
 @t
order by
 tv;

/*Надежно*/
with s as
(
 select
  a.tv, rank() over (order by b.ch_list) as pkg
 from
  (select distinct tv from @t) a cross apply
  (select (select ch as [*] from @t where tv = a.tv order by ch for xml path(''))) b(ch_list)
)
select
 t.tv, t.ch, s.pkg
from
 @t t join
 s on s.tv = t.tv
order by
 t.tv;

Остальное уже дело техники.
20 июл 15, 13:45    [17912744]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Павел Воронцов
Кот Матроскин
пропущено...


С точки зрения залачи он не важен.
Да, потенциально может быть ситуация пакетов ((A, B), (B, С), (А, B, С)) - но с точки зрения задачи третий телевизор связан не с двумя пакетами (A, B) и (B, C), а с одним пакетом (A, В, С).
Вопрос как определяется "уникальный набор пакетов".


Это описано в условии.
Каждый телевизор принимает какой-то один пакет каналов
20 июл 15, 13:51    [17912783]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2392
Блог
Кот Матроскин
Павел Воронцов
пропущено...
Вопрос как определяется "уникальный набор пакетов".


Это описано в условии.
Каждый телевизор принимает какой-то один пакет каналов
Точно, пропустил.
20 июл 15, 14:20    [17912950]     Ответить | Цитировать Сообщить модератору
 Re: задача sql  [new]
super-code
Member

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

-- тестовые данные
declare @t table (tv int, chain char)

insert into @t
values
	(1, 'a'),
	(2, 'a'),
	(3, 'c'),
	(1, 'd'),
	(4, 'd'),
	(4, 'a'),
	(5, 'a'),
	(5, 'e'),
	(6, 'a'),
	(6, 'e'),
	(7, 'a'),
	(7, 'e')

-- заполняем таблицу совпадений по телевизорам (совпадение по каналам = один пакет)
declare @compare_tv table (tv1 int, tv2 int)

insert into @compare_tv
select distinct
	t2.tv,
	t1.tv
from @t t2, @t t1
where t1.tv <> t2.tv and -- одинаковый состав каналов, если кол-во равно и разница по записям - пустое множество
	(select count(*) from
		((select t3.chain
		from @t t3
		where t3.tv = t1.tv)
		except
		(select t4.chain
		from @t t4
		where t4.tv = t2.tv)) temp
		) = 0
	and (select count(*) from @t t3 where t3.tv = t1.tv)
		= (select count(*) from @t t4 where t4.tv = t2.tv)

select * from @compare_tv

-- выбираем все телевизоры, у которых нет дублей, либо это первый телевизор из группы
select t1.tv as [package], t1.chain
from @t t1
where not exists (select * from @compare_tv t2 where t1.tv = t2.tv1) -- нет дублей
	or (select min(t2.tv1) from @compare_tv t2 where t2.tv2 = t1.tv or t2.tv1 = t1.tv) = t1.tv -- первые телевизор в группе
order by t1.tv, t1.chain
20 июл 15, 15:21    [17913336]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить