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

Откуда: Lobnya
Сообщений: 216
Уважаемые коллеги, помогите составить запрос для выборки "уникальных" записей.
Исходные данные:
with a as (
  select 'A' a, 'B' b
), b as (
  select a, b from a 
  union 
  select b, a from a 
  union 
  select 'A', 'C'
)
select * from b 

в результате селекта необходимо получить набор
a	b
A B
A C
либо
a	b
A C
B A
То есть строки
A, B
и
B, A
считать "одинаковыми", нужно оставить только одну из них, (любую).
10 окт 17, 17:02    [20858342]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать "уникальные" записи  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Uridian,

о сегодня я уже видел такой запрос, откуда он? :)
10 окт 17, 17:04    [20858351]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать "уникальные" записи  [new]
Uridian
Member

Откуда: Lobnya
Сообщений: 216
из головы. сам придумал. ))
10 окт 17, 17:13    [20858377]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать "уникальные" записи  [new]
tashkafox
Member

Откуда: Москва
Сообщений: 106
pivot и unpivot пригодился
with
a as (
select 'A' a, 'B' b
)
,b as (
select a, b from a 
union 
select b, a from a 
union 
select 'A', 'C'
)
,t as (
select
	row_number() over(order by (select null)) as rn_row, *
from b 
)
,unp as (
select
	rn_row
	,lit
	,row_number() over (partition by rn_row order by lit) as rn_col
from t unpivot (lit for [column] in (a, b)) as unp
)

select distinct piv.[1], piv.[2]
from unp pivot (min(lit) for rn_col in ([1], [2])) piv
10 окт 17, 17:49    [20858501]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать "уникальные" записи  [new]
aleks222
Guest
tashkafox
pivot и unpivot пригодился
with
a as (
select 'A' a, 'B' b
)
,b as (
select a, b from a 
union 
select b, a from a 
union 
select 'A', 'C'
)
,t as (
select
	row_number() over(order by (select null)) as rn_row, *
from b 
)
,unp as (
select
	rn_row
	,lit
	,row_number() over (partition by rn_row order by lit) as rn_col
from t unpivot (lit for [column] in (a, b)) as unp
)

select distinct piv.[1], piv.[2]
from unp pivot (min(lit) for rn_col in ([1], [2])) piv

Чесслово, лучше уж вы гвозди компом забивайте.
10 окт 17, 17:58    [20858527]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать "уникальные" записи  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
tashkafox,
ого..

select a.*
from b a  
LEFT JOIN b b
ON
 b.b = a.a AND
 b.a = a.b 	
WHERE a.a > a.b OR b.a IS NULL
10 окт 17, 18:01    [20858537]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать "уникальные" записи  [new]
tashkafox
Member

Откуда: Москва
Сообщений: 106
TaPaK,
Ок, а если столбцов будет больше?
10 окт 17, 18:10    [20858556]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать "уникальные" записи  [new]
Владислав Колосов
Member

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

если столбцов будет больше, то это будет дедушка, а не бабушка.
10 окт 17, 18:29    [20858598]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать "уникальные" записи  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
tashkafox
TaPaK,
Ок, а если столбцов будет больше?

ну давайте пофантазируем, как выбрать наибольшее из, 3х :)
10 окт 17, 18:38    [20858614]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать "уникальные" записи  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
tashkafox
Ок, а если столбцов будет больше?
А если больше и разнотипные, то, например, так:
with a as (
  select 'A' a, 'B' b, 2 as c, 1.5 as d, getdate() as e, dateadd(day, -10, getdate()) as f
), b as (
  select a, b, c, d, e, f from a 
  union 
  select b, a, c, d, f, e from a 
  union 
  select a, b, c, d, f, e from a 
  union 
  select 'A', 'C', 0, 0, dateadd(day, -1, getdate()), getdate()
)
select top (1) with ties
 b.a, b.b, b.c, b.d, b.e, b.f
from
 b cross apply
 (
  select
   v as [*]
  from
   (
    values
     (cast(b.a as sql_variant)),
     (cast(b.b as sql_variant)),
     (cast(b.c as sql_variant)),
     (cast(b.d as sql_variant)),
     (cast(b.e as sql_variant)),
     (cast(b.f as sql_variant))
   ) t(v)
  order by
   v
  for xml path('')
 ) c(x)
order by
 row_number() over (partition by c.x order by c.x);
10 окт 17, 19:29    [20858712]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать "уникальные" записи  [new]
Uridian
Member

Откуда: Lobnya
Сообщений: 216
Выкрутился так, но выглядит многословно, (зато джойнов нет):
with a as (
  select 'A' a, 'B' b
), b as (
  select * from a 
  union 
  select b a, a b from a 
  union 
  select 'A', 'C'
), c as (select case when a < b then a else b end a, case when a < b then b else a end b from b)
, d as (select *, row_number() over (partition by a, b order by a, b) as RowNmb from c)
select a, b from d where RowNmb = 1
12 окт 17, 10:18    [20862929]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить