powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вернуть Id, если distinct по остальным полям таблицы дает 1 запись
7 сообщений из 7, страница 1 из 1
Вернуть Id, если distinct по остальным полям таблицы дает 1 запись
    #39596543
distinct & id
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Возникла такая задача: есть таблица вида:
Код: sql
1.
2.
3.
4.
5.
6.
declare
  @t table (
    id int not null identity primary key,
    a varchar(1) not null,
    b varchar(1) not null
  );


Требуется, если все значения полей a и b одинаковы, вывести одну запись, где в качестве id 0, и уникальные значения a и b, а если значения a и b хотя бы в одной записи отличаются от прочих - вывести все записи с реальным значением id, и соответствующими значениями a и b. Пока придумал вот такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare
  @t table (
    id int not null identity primary key,
    a varchar(1) not null,
    b varchar(1) not null
  );
insert into @t(a, b) values('a','b'),('a', 'c');
select distinct
  case when (select count(*) from (select distinct a, b from @t) v)=1 then 0 else id end id,
  a, b
from @t


- может, это можно сделать как-то изящнее?
...
Рейтинг: 0 / 0
Вернуть Id, если distinct по остальным полям таблицы дает 1 запись
    #39596614
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
distinct & id,

Код: sql
1.
2.
3.
4.
select case when t.cnt > 0 then 0 else (select min(t1.id) from @t t1 where t1.a=t.a and t1.b=t.b) end as id,
t.a,
t.b
from (select count(*) as cnt, a, b from @t group by a,b) t
...
Рейтинг: 0 / 0
Вернуть Id, если distinct по остальным полям таблицы дает 1 запись
    #39596622
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Воронцов,

> 1 конечно
...
Рейтинг: 0 / 0
Вернуть Id, если distinct по остальным полям таблицы дает 1 запись
    #39597172
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Воронцов,
Разве что:
Код: sql
1.
case when (select count(distinct a)+count(distinct b) from @t)=2 then 0 else id end id,
...
Рейтинг: 0 / 0
Вернуть Id, если distinct по остальным полям таблицы дает 1 запись
    #39597242
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
distinct & idможет, это можно сделать как-то изящнее?Критерии изящности сугубо индивидуальны :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t as
(
 select
  id, a, b,
  rank() over (order by a, b) r1,
  rank() over (order by a desc, b desc) r2,
  row_number() over (order by (select 1)) as rn
 from
  @t
)
select
 case when r1 = r2 then 0 else id end as id, a, b
from
 t
where
 (rn = 1 and r1 = r2) or (r1 <> r2);
...
Рейтинг: 0 / 0
Вернуть Id, если distinct по остальным полям таблицы дает 1 запись
    #39597267
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,
У тебя пропадает значение "посередине" при нечетном количестве уникальных сочетаний a и b (выполняется условие r1=r2).
Например при
Код: sql
1.
insert into @t(a, b) values('a','b'),('a', 'c'),('b', 'c');


Получаем:
idab3bc1ab
...
Рейтинг: 0 / 0
Вернуть Id, если distinct по остальным полям таблицы дает 1 запись
    #39597373
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KopellyУ тебя пропадает значение "посередине" при нечетном количестве уникальных сочетанийДа, вы правы. Спасибо.

Сделаем иначе:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t as
(
 select
  id, a, b,
  count(*) over (partition by a, b) c1,
  count(*) over () c2,
  row_number() over (order by (select 1)) as rn
 from
  @t
)
select
 case when c1 = c2 then 0 else id end as id, a, b
from
 t
where
 (rn = 1 and c1 = c2) or (c1 <> c2);
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вернуть Id, если distinct по остальным полям таблицы дает 1 запись
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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