Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sql фильтр по нескольким колонкам / 5 сообщений из 5, страница 1 из 1
05.01.2021, 19:17
    #40033679
kypiwindy1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sql фильтр по нескольким колонкам
Подскажите, пожалуйста как можно пофильтровать значения

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare @t1 table (id int,val int,other nvarchar(255))

insert into @t1 values                     (1,12,NULL),
                                           (4,12,NULL),
					   (4,12,NULL),
					   (2,3,NULL),
					   (2,4,NULL),
					   (2,5,NULL)
-- как пофильтровать сначала по максимально val , если их несколько то выбрать макс Id
-- остальный строки удалить.

-- должно остаться    4  12
--                    2   3
--                    2   4 
--                    2   5 

select * from @t1
...
Рейтинг: 0 / 0
05.01.2021, 19:40
    #40033682
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sql фильтр по нескольким колонкам
kypiwindy1,

если честно какая то ерунда в вопросе.

результирующий набор который Вы хотите получить достигается:
Код: sql
1.
2.
3.
select max(id), val
from @t1 
group by val



но с кучей оговорок.
...
Рейтинг: 0 / 0
05.01.2021, 19:46
    #40033684
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sql фильтр по нескольким колонкам
kypiwindy1,

А вот если нужен еще и other, то чуть сложнее:
Код: sql
1.
2.
3.
4.
5.
6.
7.
;WITH MaxVal AS (
  SELECT id, val, other, ROW_NUMBER() OVER (PARTITION BY val ORDER BY id DESC) AS rn
  FROM @t1 )
SELECT id, val, other
FROM MaxVal
WHERE rn=1
ORDER BY id DESC
...
Рейтинг: 0 / 0
06.01.2021, 10:06
    #40033767
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sql фильтр по нескольким колонкам
Код: sql
1.
2.
3.
SELECT top(1) with ties *
  FROM @t1
Order BY ROW_NUMBER() OVER (PARTITION BY val ORDER BY id DESC) ASC


Но предыдущий оратор, в общем, выдал более правильное решение, если полученную выборку планируется в дальнейшем использовать в подзапросе.
Т.к. top(1) сбивает с толку оптимизатор и он, в дальнейшем, будет пытаться соединить результат выборки с внешним запросом через nested loop, что может оказаться очень неоптимально, если такая подвыборка возвращает много записей.

Для одиночного запроса - монопениссуарно.
...
Рейтинг: 0 / 0
06.01.2021, 10:25
    #40033770
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sql фильтр по нескольким колонкам
uaggster
Для одиночного запроса - монопениссуарно.
Уже неоднократно писалось, что нет
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
use tempdb;
set ansi_nulls, quoted_identifier, xact_abort on;
go

create table dbo.t (id int identity primary key, g int, v float);

insert into dbo.t
 (g, v)
 select top (2000000)
  row_number() over (order by 1/0) % 10,
  rand(checksum(newid()))
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;

create index IX_t__g__v on dbo.t (g, v);
go

declare @g int, @v float;

set statistics time on;
--set statistics xml on;

with t as
(
 select
  g, v, row_number() over (partition by g order by v) as rn
 from
  dbo.t
)
select
 @g = g, @v = v
from
 t
where
 rn = 1
option
 (maxdop 1);

select top (1) with ties
 @g = g, @v = v 
from
 dbo.t
order by
 row_number() over (partition by g order by v)
option
 (maxdop 1);

set statistics time off;
--set statistics xml off;
 
drop table dbo.t;
go


Код: plaintext
1.
2.
3.
4.
5.
 SQL Server Execution Times:
   CPU time = 125 ms,  elapsed time = 132 ms.

 SQL Server Execution Times:
   CPU time = 437 ms,  elapsed time = 441 ms.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sql фильтр по нескольким колонкам / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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