powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выборка строк с уникальными значениями в столбцах
9 сообщений из 9, страница 1 из 1
выборка строк с уникальными значениями в столбцах
    #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
выборка строк с уникальными значениями в столбцах
    #40101714
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nicolay,

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

Имхо проще всего будет сделать через unpivot. Все остальное будет, в том или ином виде, вариацией на ту же тему.
...
Рейтинг: 0 / 0
выборка строк с уникальными значениями в столбцах
    #40101721
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
выборка строк с уникальными значениями в столбцах
    #40101723
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.
...
Рейтинг: 0 / 0
выборка строк с уникальными значениями в столбцах
    #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
выборка строк с уникальными значениями в столбцах
    #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
выборка строк с уникальными значениями в столбцах
    #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
выборка строк с уникальными значениями в столбцах
    #40101778
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nicolay,

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

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

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


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