Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не выводить значение в поле, если оно встречалось в предыдущей строке / 8 сообщений из 8, страница 1 из 1
01.02.2021, 12:02
    #40040422
Рустамка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не выводить значение в поле, если оно встречалось в предыдущей строке
Доброго дня, Форум!
Есть запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with res as (
	select 1 as a, 2 as b
	union all
	select 1 as a, 3 as b
	union all
	select 1 as a, 4 as b
	union all
	select 2 as a, 5 as b
)
select a, b from res
group by 
	res.a
	, res.b


который выводит результат:
ab12131425
Имеется ли решение на стороне СУБД (SQL Server), которое позволит выводить результат запроса вот так:
ab12 3 425
Что я уже попробовал:
1. Обрабатывать вывод информации на стороне фронта:
Код: c#
1.
2.
3.
4.
5.
6.
7.
if (val == prev_val) {
 Console.WriteLine("");
}
else {
 Console.WriteLine(val);
 prev_val = val;
}


2. То же самое обрабатывать в хранимой процедуре:
Код: sql
1.
2.
3.
if(@val = @prev_val) set @val = ''
else @prev_val = @val
print(@val)


Решение вроде как работает, но хочется элегантнее выдавать значения :)
Что я подозреваю - возможно есть решение с помощью либо lag(), либо lead().
Буду рад ответу с направлением чтения.
Спасибо!
...
Рейтинг: 0 / 0
01.02.2021, 12:14
    #40040427
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не выводить значение в поле, если оно встречалось в предыдущей строке
Рустамка,

если имеется столбец сортировки, то можно использовать LAG() для сравнения значений, но то, что требуется, подавление повторяющихся значений, обычно реализуют средствами системы отчетов, а не базы данных
...
Рейтинг: 0 / 0
01.02.2021, 12:38
    #40040445
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не выводить значение в поле, если оно встречалось в предыдущей строке
по совету из поста выше:
Код: sql
1.
iif(lag(a)over(order by a)=a,null,a)x
...
Рейтинг: 0 / 0
01.02.2021, 12:47
    #40040451
Рустамка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не выводить значение в поле, если оно встречалось в предыдущей строке
@Владислав Колосов ,
В принципе это и подозревал, но всегда не уверен в своих знаниях, поэтому лучше лишний раз переспросить, чем изобретать велосипед. Спасибо большое за ответ!
@vikkiv , да. На стороне mdx я бы сделал точно так же, но в том же SSRS при группировке по полям происходит именно подавление повторяющегося значения (спасибо @Владислав Колосов за правильную формулировку) - интересна была природа механизма подавления - на какой стороне осуществлялось подавление: на стороне SSRS с помощью внутренних механизмов, либо тот же SSRS мой запрос оборачивает в своё sql-решение, которое я и пытался узнать )).
В любом случае теперь понимаю, почему на стороне фронта это делать правильнее и выгоднее. Спасибо всем большое!
...
Рейтинг: 0 / 0
01.02.2021, 12:59
    #40040457
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не выводить значение в поле, если оно встречалось в предыдущей строке
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with res as (
	select 1 as a, 2 as b
	union all
	select 1 as a, 3 as b
	union all
	select 1 as a, 4 as b
	union all
	select 2 as a, 5 as b
)
select case when row_number() over (partition by a order by b) = 1 then a end, b from res
group by 
	res.a
	, res.b
...
Рейтинг: 0 / 0
01.02.2021, 13:27
    #40040471
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не выводить значение в поле, если оно встречалось в предыдущей строке
invm,

мы оба пошли на поводу у туннельного воображения,
при этом ТС нигде не упоминал ни о партиционировании ни о сортировке ни по какому полю..
(только зачем-то добавил группировку)
...
Рейтинг: 0 / 0
01.02.2021, 13:39
    #40040475
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не выводить значение в поле, если оно встречалось в предыдущей строке
vikkiv
по совету из поста выше:
Код: sql
1.
iif(lag(a)over(order by a)=a,null,a)x

чуть меньше буков :)
Код: sql
1.
nullif(a,lag(a)over(order by b))
...
Рейтинг: 0 / 0
01.02.2021, 14:25
    #40040495
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не выводить значение в поле, если оно встречалось в предыдущей строке
invm
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with res as (
	select 1 as a, 2 as b
	union all
	select 1 as a, 3 as b
	union all
	select 1 as a, 4 as b
	union all
	select 2 as a, 5 as b
)
select case when row_number() over (partition by a order by b) = 1 then a end, b from res
group by 
	res.a
	, res.b

А если там ещё будет (a=1, b=6) ? После двойки будет NULL? Это правильно?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не выводить значение в поле, если оно встречалось в предыдущей строке / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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