Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Исключить дубли, результаты перестановки (A-B, B-A)  [new]
DeeZ
Member

Откуда:
Сообщений: 45
Есть табличка, в которой перечислены линки между коммутаторами:
Node1Node2
ab
ac
ba
ca

По сути A-B и B-A это один и тот же линк, просто с точки зрения разных коммутаторов. Как можно сделать выборку только униклаьных пар? Из таблицы выше должны остаться (не обязательно в таком порядке):
Node1 Node2
ab
ac
25 ноя 14, 08:43    [16899903]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
DeeZ,

SELECT *
FROM tbl t1
WHERE NOT EXISTS (SELECT * FROM tbl t2 
                           WHERE t1.Node1=t2.Node2
                                 AND t1.Node2=t2.Node1
                                 AND t2.Node1>t1.Node1)
25 ноя 14, 08:55    [16899925]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10232
Блог
не совсем понял в чём сложность проверить пересечение таблицы самой с собой?!
25 ноя 14, 08:55    [16899927]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
aleks2
Guest
DeeZ
Есть табличка, в которой перечислены линки между коммутаторами:
Node1Node2
ab
ac
ba
ca

По сути A-B и B-A это один и тот же линк, просто с точки зрения разных коммутаторов. Как можно сделать выборку только униклаьных пар? Из таблицы выше должны остаться (не обязательно в таком порядке):
Node1 Node2
ab
ac


1. Упорядочиваешь пары.
2. Группируешь.
3. Фсе.
25 ноя 14, 09:14    [16900017]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
aleks2
Guest
with
o as (select case when Node1<=Node2 then Node1 else Node2 end as N1
           , case when Node1<=Node2 then Node2 else Node1 end as N2
        from aTable
     )

select N1, N2 from o group by N1, N2
25 ноя 14, 09:18    [16900027]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
DeeZ
Member

Откуда:
Сообщений: 45
Ruuu, Спасибо. вроде, сработало, так как нужно.

aleks2, спасибо. ваш вариант тоже сработал. Но в отличии от первого я не понял как он работает

Knyazev Alexey
не совсем понял в чём сложность проверить пересечение таблицы самой с собой?!

Сложность в недостаточности знаний. :)
25 ноя 14, 09:57    [16900192]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Wlr-l
Member

Откуда:
Сообщений: 523
DeeZ, если немного усложнить данные:

Node1 Node2
a b
a c
a c
a a
b a
c a,

то в варианте Ruuu получим:
Node1 Node2
a b
a c
a c
a a

а в варианте aleks2:
N1 N2
a a
a b
a c

т.е. вариант aleks2 "делает выборку только уникальных пар"
25 ноя 14, 10:57    [16900470]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4967
Wlr-l,
Удаление повторяющихся строк с помощью ключевого слова DISTINCT
25 ноя 14, 12:19    [16901049]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Wlr-l
Member

Откуда:
Сообщений: 523
ЕвгенийВ,

ТС не смог разобраться в двух CASE.
Может просто разобраться как работает CASE, тогда вопрос о DISTINCTe не возникнет, но можно и с DISTINCTом:

1. Упорядочиваешь пары. (CASE)
2. Находишь уникальные пары. (DISTINCT)
3. Фсе.

with aTable as (
     select *
       from (values ('a', 'b'),
                    ('a', 'c'),
                    ('a', 'c'),
                    ('a', 'a'),
                    ('b', 'a'),
                    ('c', 'a')
            ) as T(Node1,Node2)

)
,o as (select case when Node1<=Node2 then Node1 else Node2 end as N1
             ,case when Node1<=Node2 then Node2 else Node1 end as N2
         from aTable
)

select distinct N1, N2 from o --group by N1, N2


Разницы между этим вариантам и с вариантом group by нет.

Вы тоже все еще не разобрались? Попробуйте выполнить этот запрос с такой строкой
select distinct N1, N2 from o

и посмотрите результат.
25 ноя 14, 12:58    [16901363]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Wlr-l
Member

Откуда:
Сообщений: 523
Wlr-l, Извините, поспешил, с такой строкой

select N1, N2 from o
25 ноя 14, 13:00    [16901385]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Mairos
Member

Откуда:
Сообщений: 555
DeeZ, если есть просто список маршрутизаторов, то список пар получаете по аналогии с вот этим..
-- расписание игр по списку
  
create table players (nom int, name varchar(20));
 
insert into players (nom,name) values(1,'СПАРТАК');  
insert into players (nom,name) values(2,'ЦСКА');    
insert into players (nom,name) values(3,'ДИНАМО');
insert into players (nom,name) values(4,'ЗЕНИТ');
 
        
select t1.name, t2.name from Players t1
  join Players t2 on  t1.nom > t2.nom   
25 ноя 14, 15:06    [16902603]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4813
Универсальный вариант для большего кол-во полей

with aTable as (
     select *
       from (values ('a', 'b', 'c'),
                    ('a', 'c', 'b'),
                    ('a', 'c', 'c'),
                    ('a', 'a', 'a'),
                    ('b', 'a', 'a'),
                    ('c', 'a', 'a')
            ) as T(Node1,Node2,Node3)

)
,o as (
	select 
			Node1 = (SELECT t.Node FROM (values (aTable.Node1),(aTable.Node2),(aTable.Node2)) t(Node) ORDER BY Node OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY),
			Node2 = (SELECT t.Node FROM (values (aTable.Node1),(aTable.Node2),(aTable.Node2)) t(Node) ORDER BY Node OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY),
			Node3 = (SELECT t.Node FROM (values (aTable.Node1),(aTable.Node2),(aTable.Node2)) t(Node) ORDER BY Node OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY) 
	FROM aTable
)
select DISTINCT Node1,Node2,Node3 from o 
25 ноя 14, 16:17    [16903153]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
o-o
Guest
"универсальность", видимо, к версии сервера относится
25 ноя 14, 17:10    [16903529]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
user89
Member

Откуда:
Сообщений: 2083
Mairos
-- расписание игр по списку  
create table players (nom int, name varchar(20));
 
insert into players (nom,name) values(1,'СПАРТАК');  
insert into players (nom,name) values(2,'ЦСКА');    
insert into players (nom,name) values(3,'ДИНАМО');
insert into players (nom,name) values(4,'ЗЕНИТ');
 
select t1.name, t2.name from Players t1
join Players t2 on  t1.nom > t2.nom   

Была интересная тема построение календаря игр
25 ноя 14, 19:15    [16904273]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Mairos
Member

Откуда:
Сообщений: 555
user89, оно оно самое )) Я просто на собеседе ЭТО решал, а уши вот откуда у него растут )))
26 ноя 14, 10:01    [16906226]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21042
DeeZ
По сути A-B и B-A это один и тот же линк, просто с точки зрения разных коммутаторов. Как можно сделать выборку только униклаьных пар?
Надо не выборки хитрозадые рисовать, а данные нормализовать! В записях, где Node1 > Node2 (или наоборот) - поменять их местами, а потом удавить дубли. И переделать клиентскую часть - чтобы в дальнейшем такого бардака не было (и constraint на таблицу для верного).
А вы всё костыль к костылю придумываете...
26 ноя 14, 10:56    [16906543]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Wlr-l
Member

Откуда:
Сообщений: 523
Akina
DeeZ
По сути A-B и B-A это один и тот же линк, просто с точки зрения разных коммутаторов. Как можно сделать выборку только униклаьных пар?
Надо не выборки хитрозадые рисовать, а данные нормализовать! В записях, где Node1 > Node2 (или наоборот) - поменять их местами, а потом удавить дубли. И переделать клиентскую часть - чтобы в дальнейшем такого бардака не было (и constraint на таблицу для верного).
А вы всё костыль к костылю придумываете...


A-B и B-A отражает, как сказал ТС, "точки зрения" разных коммутаторов А и В. В Вашем предложении, возможно, придется добавить признак "точка зрения коммутатора Х".
Вполне возможно, что данные получены с разных коммутаторов и ТС пытался сделать то, что Вы сказали: "поменять местами, а потом удавить дубли", но не смог? Может это всего лишь этап "очистка и предобработка данных"? Может нужно заливать данные в хранилище данных, а там нормализация ну ни как не нужна?!
"И переделать клиентскую часть" - это поменять встроенное программное обеспечение коммутатора?
Поэтому здесь "рисовались не хитрозадые выборки", а решена конкретная техническая задача. А Ваши предложения тоже можно рассматривать как костыль к "костыль к костылю".
26 ноя 14, 12:29    [16907196]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Через except решается.

ничего не надо упорядочивать и искать пересечения, пусть роботы вкалывают.
26 ноя 14, 13:18    [16907550]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Wlr-l
Member

Откуда:
Сообщений: 523
Владислав Колосов,

А можно текст такого решения в студию?
26 ноя 14, 13:27    [16907631]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
declare @t table (node1 char, node2 char)
insert into @t values ('a','c'),('a','b'),('c','a')

select node1, node2 from @t
except
select node2, node1 from @t
26 ноя 14, 13:37    [16907703]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Wlr-l
Member

Откуда:
Сообщений: 523
Владислав Колосов,

Вы забыли привести результат!
26 ноя 14, 13:40    [16907724]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Беда какая, опять невнимательно прочел :)

Как можно сделать выборку только униклаьных пар?

только это увидел.
26 ноя 14, 13:41    [16907732]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21042
Wlr-l
A-B и B-A отражает, как сказал ТС, "точки зрения" разных коммутаторов А и В. В Вашем предложении, возможно, придется добавить признак "точка зрения коммутатора Х".
Постановка задачи такова, что уже пофиг, какого это коммутатора точка зрения. Возможно, у ТС вообще нет таких задач, когда это имеет значение.
Wlr-l
Вполне возможно, что данные получены с разных коммутаторов и ТС пытался сделать то, что Вы сказали: "поменять местами, а потом удавить дубли", но не смог?
Тогда речь шла бы именно об удалении дублей, а не о выборке.
Wlr-l
Может нужно заливать данные в хранилище данных
Это уже явно данные из хранилища (сервера логов?). И если не стоИт задача хранения "сырых" данных - то самое оно на этом этапе нормализовывать, причём серверной логикой.
Wlr-l
Поэтому здесь "рисовались не хитрозадые выборки", а решена конкретная техническая задача. А Ваши предложения тоже можно рассматривать как костыль к "костыль к костылю".
Насчёт конкретной технической задачи - не убеждён. Нендостаточно данных для однозначного ответа.
Что это может быть "третий костыль" - да, возможно. Но на основе имеющихся сведений я пока не оцениваю вероятность этого как высокую.
26 ноя 14, 13:42    [16907743]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Wlr-l
Member

Откуда:
Сообщений: 523
Владислав Колосов,

Вариант EXCEPT отпадает сразу, так как разность двух одинаковых множеств даст пустое множество.
26 ноя 14, 13:57    [16907855]     Ответить | Цитировать Сообщить модератору
 Re: Исключить дубли, результаты перестановки (A-B, B-A)  [new]
Wlr-l
Member

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

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

Задача: дана таблица А, из нее получить таблицу Б. Приведено три решения этой задачи. Вы все еще в этом не убедились?! Тогда приведите свое решение.
26 ноя 14, 14:08    [16907946]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить