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

Откуда: Königsberg in Preußen
Сообщений: 79
Добрый день!
Имеются две таблицы:
T1:
id name lnk
1 xxx a
2 xxx b
3 yyy b
4 yyy b
5 yyy c
T2:
id zn
a 15
b 15
b 25
c 15
c 25
c 35

Как получит таблицу вида:
id name lnk
2 xxx b
5 yyy c

То есть убрать из исходной таблицы все строки с одинаковыми ID, Name, оставив те у которых LNK закрывает большее количество значений?
31 авг 11, 10:20    [11204422]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
iljy
Member

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

а где в первой таблице строки с одинаковыми ИД? По каким критериям рассчитывается количество закрываемых значений?
31 авг 11, 10:35    [11204491]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
iljy,

Пардон, ID не нужен, просто для удобства нумерацию воткнул.
31 авг 11, 12:57    [11205446]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
iljy
Member

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

--Это должны были сделать вы
declare @T1 table(id int, name varchar(10), lnk char(1))
insert @T1 values
(1, 'xxx', 'a'),(2, 'xxx', 'b'),(3, 'yyy', 'b'),(4, 'yyy', 'b'),(5, 'yyy', 'c')
declare @T2 table (id char(1), zn int)
insert @T2 values
('a', 15),('b', 15),('b', 25),('c', 15),('c', 25),('c', 35)
----

select top 1 with ties t1.*
from @T1 t1 join
(select id, COUNT(*) cnt from  @T2 group by id) t2 on t1.lnk = t2.id
order by ROW_NUMBER() over(partition by name order by cnt desc)
31 авг 11, 13:04    [11205506]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
iljy,

Спасибо!
Учту замечание.
31 авг 11, 14:03    [11205974]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
Немного расширю условия:
declare @T1 table(id int, name varchar(10), lnk char(1))
insert @T1 values
(1, 'xxx', 'a'),(2, 'xxx', 'b'),(3, 'yyy', 'b'),(4, 'yyy', 'b'),(5, 'yyy', 'c'), (6, 'fff', 'a'), (7, 'fff', 'b'), (8, 'fff', 'c'), (9, 'fff', 'd')
declare @T2 table (id char(1), zn int)
insert @T2 values
('a', 15),('b', 15),('b', 25),('c', 15),('c', 25),('c', 35), ('d', 45), ('d', 75)
Предложенный скрипт возвращает строку с максимальным количеством значений по lnk
А должно быть:
2 xxx b
5 yyy c
8 fff c
9 fff d
Как можно модернизировать запрос?
31 авг 11, 15:33    [11206811]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
iljy
Member

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

а из каких соображений выбирается последняя строка?
31 авг 11, 16:07    [11207164]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
iljy,

значения по ключам c и d не перекрывают друг друга, ну или c не поглощает d
31 авг 11, 16:19    [11207302]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
iljy
Member

Откуда:
Сообщений: 8711
Super_DJ
iljy,

значения по ключам c и d не перекрывают друг друга, ну или c не поглощает d

Дайте наконец определение покрытия.
31 авг 11, 16:43    [11207561]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
1d0
Member

Откуда: инфа100%
Сообщений: 2521
использовать subquery?
31 авг 11, 17:05    [11207791]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
iljy,

Перекрывание (поглощение), а не покрытие, значений одного ключа, значениями другого ключа. По принципу: имеются две ссылки(на самом деле гораздо больше) на ключи. значения одного ключа в полном объеме есть в значениях другого ключа, второй ключ полнее первого, значит выбирается он. Если ключи имеют различные значения(хотя бы одно), значит выбираются оба.
31 авг 11, 18:01    [11208190]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
Super_DJ,

Тьфу, если в значениях одного ключа нет хотя бы одного значения из значений другого ключа, значит он его не поглощает
31 авг 11, 18:03    [11208208]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Super_DJ,

Тьфу


Это вы верно заметили. Но надо не плеваться, а всемерно помогать людям пытающимся помочь вам да еще за бесплатно.
Выполните уже наконец Рекомендации по оформлению сообщений в форуме!!
31 авг 11, 18:31    [11208464]     Ответить | Цитировать Сообщить модератору
 ление перекрывающих значений  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
SamMan,

Не собирался задеть чьих то чувств, и не плевался вовсе, а себя же поправлял. Многим людям здесь признателен за уйму сэкономленного времени. Да может и сумбурно вышло, но шапку уже не поправишь. По этому поводу уже справедливо подметил iljy так что пинать еще раз нет смысла...
31 авг 11, 18:50    [11208597]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
iljy
Member

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

а если возможно несколько вариантов выбора - что делать? (a,15),(a,25),(b,35),(b,45) или (c,15),(c,35),(d,25),(d,45) - какую пару выбрать? В общем случае у вас получается задача о рюкзаке.
1 сен 11, 00:41    [11209734]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
iljy,

Все значения останутся так как каждый ключ имеет свою комбинацию значений, каждая комбинация не содержится в другойкомбинации значений. В моем случае думаю возможны только ситуации:
1: Ключи имеют абсолютно разные значения - Тоесть они все остаются.
2: Есть группа ключей, значения в которых копятся по нарастающей( a-1,2; b-1,2,3; c-1,2,3,4 ) Последний ключ содержит в себе все значения остальных ключей, другие не содержат его значений в полной мере, значит выбираем последний.
1 сен 11, 09:37    [11210118]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
Немного подыму тему
1 сен 11, 18:32    [11214908]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
iljy
Member

Откуда:
Сообщений: 8711
Super_DJ
iljy,

Все значения останутся так как каждый ключ имеет свою комбинацию значений, каждая комбинация не содержится в другойкомбинации значений. В моем случае думаю возможны только ситуации:
1: Ключи имеют абсолютно разные значения - Тоесть они все остаются.
2: Есть группа ключей, значения в которых копятся по нарастающей( a-1,2; b-1,2,3; c-1,2,3,4 ) Последний ключ содержит в себе все значения остальных ключей, другие не содержат его значений в полной мере, значит выбираем последний.

Каждая пара в моем примере перекрывает все множество значений. Получается, что вы исключаете ключ X, для которого существует ключ Y, включающий все множество атрибутов X, так? А если ключи X и Y имеют полностью совпадающий набор значений - выводятся оба или ни одного?
1 сен 11, 20:02    [11215199]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
iljy,

Да, пример про X и Y то что пытался разъяснить.
Если ключи X и Y имеют полностью совпадающий набор значений - выводятся оба.
2 сен 11, 00:43    [11215807]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
Еще раз Up
2 сен 11, 16:24    [11219798]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
Снова Up
3 сен 11, 10:39    [11222291]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
iljy
Member

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

declare @T1 table(id int, name varchar(10), lnk char(1))
insert @T1 values
(1, 'xxx', 'a'),(2, 'xxx', 'b'),(3, 'yyy', 'b'),(4, 'yyy', 'b'),(5, 'yyy', 'c'),
(6, 'fff', 'a'), (7, 'fff', 'b'), (8, 'fff', 'c'), (9, 'fff', 'd')
declare @T2 table (id char(1), zn int)
insert @T2 values
('a', 15),('b', 15),('b', 25),('c', 15),('c', 25),('c', 35), ('d', 45), ('d', 75)


select * from @T1 t1
where not exists(
	select * from @T1 tt1
	where tt1.name = t1.name and tt1.lnk != t1.lnk
		and exists(
			select * from
			(
				select * from @T2 t2 
				where t2.id = t1.lnk
			) t2 full join (
				select * from @T2 tt2
				where tt2.id = tt1.lnk
			)tt2 on t2.zn = tt2.zn
			having SUM(case when tt2.id is null then 1 else 0 end) = 0
				and SUM(case when t2.id is null then 1 else 0 end) > 0				
		)
)
3 сен 11, 12:19    [11222388]     Ответить | Цитировать Сообщить модератору
 Re: Удаление перекрывающих значений  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
iljy,

Спасибо, работает как надо!
4 сен 11, 21:52    [11225272]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить