Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выборка строк с уникальными значениями в столбцах / 9 сообщений из 9, страница 1 из 1
04.10.2021, 10:04
    #40101702
Nicolay
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выборка строк с уникальными значениями в столбцах
Добрый день,
есть подобная выборка, состоящая из 20 столбцов,
хотел бы узнать у гуру sql как отобрать из данной выборки те строки в которых содержаться только уникальные значения во всех 20 столбцах (в данной выборке это только вторая строка),
например можно ли такие значения отобрать как-то попроще через where или какой-то другой лаконичный способ?

Знаю можно сделать через unpivot или через string_split но интересует решение попроще.

Спасибо.

select *

from (
select 1 a, 2 b, 3 c, 4 d, 2 e, 3 f, 5 g, 7 h, 8 i, 9 j, 11 k, 12 l, 13 m, 15 n , 16 o, 17 p, 18 q, 4 s, 19 t , 20 u
union
select 1 ,2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 , 20
union
select 21 ,22, 23, 24, 25, 26, 27, 28, 29, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219 , 220

union
select 21 ,22, 23, 24, 25, 22, 27, 28, 29, 210, 210, 210, 213, 214, 215, 216, 217, 218, 219 , 220
) x
...
Рейтинг: 0 / 0
04.10.2021, 10:26
    #40101714
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выборка строк с уникальными значениями в столбцах
Nicolay,

Третья строка тоже с уникальными значениями.

Имхо проще всего будет сделать через unpivot. Все остальное будет, в том или ином виде, вариацией на ту же тему.
...
Рейтинг: 0 / 0
04.10.2021, 10:56
    #40101721
Guf
Guf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выборка строк с уникальными значениями в столбцах
Nicolay,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select *
    from (
            select 1 a, 2 b, 3 c, 4 d, 2 e, 3 f, 5 g, 7 h, 8 i, 9 j, 11 k, 12 l, 13 m, 15 n , 16 o, 17 p, 18 q, 4 s, 19 t , 20 u
            union
            select 1 ,2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 , 20
            union
            select 21 ,22, 23, 24, 25, 26, 27, 28, 29, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219 , 220
            union
            select 21 ,22, 23, 24, 25, 22, 27, 28, 29, 210, 210, 210, 213, 214, 215, 216, 217, 218, 219 , 220
         ) x
         cross apply (select count(distinct v.c) from (values (x.a), (x.b), (x.c), (x.d), (x.e), (x.f), (x.g), (x.h), (x.i), (x.j), (x.k), (x.l), (x.m), (x.n), (x.o), (x.p), (x.q), (x.s), (x.t), (x.u)) v(c)) uniq(val)
    where uniq.val = 20
...
Рейтинг: 0 / 0
04.10.2021, 11:00
    #40101723
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выборка строк с уникальными значениями в столбцах
.
...
Рейтинг: 0 / 0
04.10.2021, 11:58
    #40101746
Nicolay
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выборка строк с уникальными значениями в столбцах
Guf
Nicolay,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select *
    from (
            select 1 a, 2 b, 3 c, 4 d, 2 e, 3 f, 5 g, 7 h, 8 i, 9 j, 11 k, 12 l, 13 m, 15 n , 16 o, 17 p, 18 q, 4 s, 19 t , 20 u
            union
            select 1 ,2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 , 20
            union
            select 21 ,22, 23, 24, 25, 26, 27, 28, 29, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219 , 220
            union
            select 21 ,22, 23, 24, 25, 22, 27, 28, 29, 210, 210, 210, 213, 214, 215, 216, 217, 218, 219 , 220
         ) x
         cross apply (select count(distinct v.c) from (values (x.a), (x.b), (x.c), (x.d), (x.e), (x.f), (x.g), (x.h), (x.i), (x.j), (x.k), (x.l), (x.m), (x.n), (x.o), (x.p), (x.q), (x.s), (x.t), (x.u)) v(c)) uniq(val)
    where uniq.val = 20



Замечательное решение, я правильно понимая что cross apply позволяет обратиться к каждому столбцу таблицы X в отдельности и делает это в такой последовательности: первая строка таблицы X cross apply (select count(distinct v.c) from (values (x.a), (x.b), (x.c), (x.d), (x.e), (x.f), (x.g), (x.h), (x.i), (x.j), (x.k), (x.l), (x.m), (x.n), (x.o), (x.p), (x.q), (x.s), (x.t), (x.u)) v(c)) uniq(val)
where uniq.val = 20
дальше вторая строка X на cross apply и так все 4 строки?
то есть cross apply не ждет формирования всей таблицы X а применяется сразу по мере формирования таблицы X?
...
Рейтинг: 0 / 0
04.10.2021, 12:44
    #40101765
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выборка строк с уникальными значениями в столбцах
Nicolay,

Независимо от числа столбцов
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select x.*

from (
select 1 a, 2 b, 3 c, 4 d, 2 e, 3 f, 5 g, 7 h, 8 i, 9 j, 11 k, 12 l, 13 m, 15 n , 16 o, 17 p, 18 q, 4 s, 19 t , 20 u
union
select 1 ,2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 , 20
union
select 21 ,22, 23, 24, 25, 26, 27, 28, 29, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219 , 220

union
select 21 ,22, 23, 24, 25, 22, 27, 28, 29, 210, 210, 210, 213, 214, 215, 216, 217, 218, 219 , 220
) x cross apply
(
 select x.* for xml path(''), type
) a(x) cross apply
(
 select count(distinct t.n.value('.', 'int')), count(*) from a.x.nodes('*') t(n)
) c (cd, c)
where
 c.cd = c.c
...
Рейтинг: 0 / 0
04.10.2021, 13:09
    #40101772
Nicolay
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выборка строк с уникальными значениями в столбцах
invm
Nicolay,

Независимо от числа столбцов
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select x.*

from (
select 1 a, 2 b, 3 c, 4 d, 2 e, 3 f, 5 g, 7 h, 8 i, 9 j, 11 k, 12 l, 13 m, 15 n , 16 o, 17 p, 18 q, 4 s, 19 t , 20 u
union
select 1 ,2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 , 20
union
select 21 ,22, 23, 24, 25, 26, 27, 28, 29, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219 , 220

union
select 21 ,22, 23, 24, 25, 22, 27, 28, 29, 210, 210, 210, 213, 214, 215, 216, 217, 218, 219 , 220
) x cross apply
(
 select x.* for xml path(''), type
) a(x) cross apply
(
 select count(distinct t.n.value('.', 'int')), count(*) from a.x.nodes('*') t(n)
) c (cd, c)
where
 c.cd = c.c


Спасибо, в значении столбцов м.б. не только значения типа int - но это не важно в данном случае, тк интересует только способ реализации.
Ответьте пожалуйста на следующий вопрос: я правильно понимаю что cross apply позволяет обратиться к каждому столбцу таблицы X в отдельности и делает это последовательно для каждой строки X по мере формирования таблицы X?

то есть cross apply не ждет формирования всей таблицы X а применяется сразу по мере формирования таблицы X?
...
Рейтинг: 0 / 0
04.10.2021, 13:23
    #40101778
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выборка строк с уникальными значениями в столбцах
Nicolay,

Apply обеспечивает выполнение правой части для каждой строки из левой.
Как это будет обеспечиваться физически - не определено.
...
Рейтинг: 0 / 0
04.10.2021, 14:34
    #40101811
Nicolay
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выборка строк с уникальными значениями в столбцах
invm
Nicolay,

Apply обеспечивает выполнение правой части для каждой строки из левой.
Как это будет обеспечиваться физически - не определено.

Спасибо, отличный вариант решения без unpivot
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выборка строк с уникальными значениями в столбцах / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]