Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
DeeZ Member Откуда: Сообщений: 45 |
Есть табличка, в которой перечислены линки между коммутаторами:
По сути A-B и B-A это один и тот же линк, просто с точки зрения разных коммутаторов. Как можно сделать выборку только униклаьных пар? Из таблицы выше должны остаться (не обязательно в таком порядке):
|
||||||||||||||||||
25 ноя 14, 08:43 [16899903] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10232 Блог |
не совсем понял в чём сложность проверить пересечение таблицы самой с собой?! |
25 ноя 14, 08:55 [16899927] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
1. Упорядочиваешь пары. 2. Группируешь. 3. Фсе. |
||||||||||||||||||||
25 ноя 14, 09:14 [16900017] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
DeeZ Member Откуда: Сообщений: 45 |
Ruuu, Спасибо. вроде, сработало, так как нужно. aleks2, спасибо. ваш вариант тоже сработал. Но в отличии от первого я не понял как он работает ![]()
Сложность в недостаточности знаний. :) |
||
25 ноя 14, 09:57 [16900192] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
ЕвгенийВ Member Откуда: Москва Сообщений: 4967 |
Wlr-l, Удаление повторяющихся строк с помощью ключевого слова DISTINCT |
25 ноя 14, 12:19 [16901049] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Wlr-l Member Откуда: Сообщений: 523 |
Wlr-l, Извините, поспешил, с такой строкойselect N1, N2 from o |
25 ноя 14, 13:00 [16901385] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
"универсальность", видимо, к версии сервера относится ![]() |
25 ноя 14, 17:10 [16903529] Ответить | Цитировать Сообщить модератору |
user89 Member Откуда: Сообщений: 2083 |
Была интересная тема построение календаря игр |
||
25 ноя 14, 19:15 [16904273] Ответить | Цитировать Сообщить модератору |
Mairos Member Откуда: Сообщений: 555 |
user89, оно оно самое )) Я просто на собеседе ЭТО решал, а уши вот откуда у него растут ))) |
26 ноя 14, 10:01 [16906226] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 21042 |
А вы всё костыль к костылю придумываете... |
||
26 ноя 14, 10:56 [16906543] Ответить | Цитировать Сообщить модератору |
Wlr-l Member Откуда: Сообщений: 523 |
A-B и B-A отражает, как сказал ТС, "точки зрения" разных коммутаторов А и В. В Вашем предложении, возможно, придется добавить признак "точка зрения коммутатора Х". Вполне возможно, что данные получены с разных коммутаторов и ТС пытался сделать то, что Вы сказали: "поменять местами, а потом удавить дубли", но не смог? Может это всего лишь этап "очистка и предобработка данных"? Может нужно заливать данные в хранилище данных, а там нормализация ну ни как не нужна?! "И переделать клиентскую часть" - это поменять встроенное программное обеспечение коммутатора? Поэтому здесь "рисовались не хитрозадые выборки", а решена конкретная техническая задача. А Ваши предложения тоже можно рассматривать как костыль к "костыль к костылю". |
||||
26 ноя 14, 12:29 [16907196] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8485 |
Через except решается. ничего не надо упорядочивать и искать пересечения, пусть роботы вкалывают. |
26 ноя 14, 13:18 [16907550] Ответить | Цитировать Сообщить модератору |
Wlr-l Member Откуда: Сообщений: 523 |
Владислав Колосов, А можно текст такого решения в студию? |
26 ноя 14, 13:27 [16907631] Ответить | Цитировать Сообщить модератору |
Владислав Колосов 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] Ответить | Цитировать Сообщить модератору |
Wlr-l Member Откуда: Сообщений: 523 |
Владислав Колосов, Вы забыли привести результат! |
26 ноя 14, 13:40 [16907724] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8485 |
Беда какая, опять невнимательно прочел :)
только это увидел. |
||
26 ноя 14, 13:41 [16907732] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 21042 |
Что это может быть "третий костыль" - да, возможно. Но на основе имеющихся сведений я пока не оцениваю вероятность этого как высокую. |
||||||||
26 ноя 14, 13:42 [16907743] Ответить | Цитировать Сообщить модератору |
Wlr-l Member Откуда: Сообщений: 523 |
Владислав Колосов, Вариант EXCEPT отпадает сразу, так как разность двух одинаковых множеств даст пустое множество. |
26 ноя 14, 13:57 [16907855] Ответить | Цитировать Сообщить модератору |
Wlr-l Member Откуда: Сообщений: 523 |
Akina, В том то и дело, что не зная всех условий мы даем советы, если "вероятность не высокая". Но прыгнуть с парашютом, у которого вероятность раскрытия "не высокая", мы бы не стали. Задача: дана таблица А, из нее получить таблицу Б. Приведено три решения этой задачи. Вы все еще в этом не убедились?! Тогда приведите свое решение. |
26 ноя 14, 14:08 [16907946] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |