Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на выборку последних данных / 8 сообщений из 8, страница 1 из 1
30.10.2021, 16:57
    #40108285
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку последних данных
Доброго дня!

В SQL не силен...
Хочу создать запрос на выборку последних имеющихся данных по группе и условиям.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table #reports (
	[id] int, 
	[pid] int,
	[year] int,
	[month] tinyint,
	[data] nvarchar(32)
)
go
insert into #reports values (100202101, 100, 2021, 1, 'test-100-2021-1')
go
insert into #reports values (100202102, 100, 2021, 2, 'test-100-2021-2')
go
insert into #reports values (200202101, 200, 2021, 1, 'test-200-2021-1')
go


с условием, что-то типа такого:
Код: sql
1.
where [pid] in (100, 200) and [year] = 2021 and [month] >= 2


из приведенного нужно получить это:
Код: sql
1.
2.
100202102	100	2021	2	'test-100-2021-2'
200202101	200	2021	1	'test-200-2021-1'


т.е. запрос должен отдать вторую запись для [pid] = 100 и первую для [pid] = 200.
Даже не могу грамотно сформулировать вопрос для взрослых SQL-спецов.
...
Рейтинг: 0 / 0
30.10.2021, 17:57
    #40108294
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку последних данных
Virtual Student
Доброго дня!

В SQL не силен...
Хочу создать запрос на выборку последних имеющихся данных по группе и условиям.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table #reports (
	[id] int, 
	[pid] int,
	[year] int,
	[month] tinyint,
	[data] nvarchar(32)
)
go
insert into #reports values (100202101, 100, 2021, 1, 'test-100-2021-1')
go
insert into #reports values (100202102, 100, 2021, 2, 'test-100-2021-2')
go
insert into #reports values (200202101, 200, 2021, 1, 'test-200-2021-1')
go


с условием, что-то типа такого:
Код: sql
1.
where [pid] in (100, 200) and [year] = 2021 and [month] >= 2


из приведенного нужно получить это:
Код: sql
1.
2.
100202102	100	2021	2	'test-100-2021-2'
200202101	200	2021	1	'test-200-2021-1'


т.е. запрос должен отдать вторую запись для [pid] = 100 и первую для [pid] = 200.
Даже не могу грамотно сформулировать вопрос для взрослых SQL-спецов.



и что не получается?
...
Рейтинг: 0 / 0
30.10.2021, 19:01
    #40108306
godsql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку последних данных
cross apply посмотри
...
Рейтинг: 0 / 0
30.10.2021, 19:50
    #40108309
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку последних данных
Код: sql
1.
2.
3.
4.
SELECT TOP(1) WITH TIES *
FROM #reports
WHERE [year] = 2021 and [month]>=2
ORDER BY RANK()OVER(PARTITION BY [id] ORDER BY [data] DESC));

Если нужно по одной записи для каждого id, то замените RANK() на ROW_NUMBER().

Имею в виду, что у вас две записи имеют одну и ту же дату.
...
Рейтинг: 0 / 0
30.10.2021, 22:04
    #40108328
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку последних данных
iap
Код: sql
1.
2.
3.
4.
SELECT TOP(1) WITH TIES *
FROM #reports
WHERE [year] = 2021 and [month]>=2
ORDER BY RANK()OVER(PARTITION BY [id] ORDER BY [data] DESC));

Если нужно по одной записи для каждого id, то замените RANK() на ROW_NUMBER().

Имею в виду, что у вас две записи имеют одну и ту же дату.

Большое спасибо за ответ!
Но, не взлетело... :(
В результате возвращается только одна запись, и только для одного id и для RANK() и для ROW_NUMBER().
Со сменой условия на [month] <= 2 - возвращается весь набор записей.

Да, нужно именно по одной, последней записи для набора id, если такие существуют.
...
Рейтинг: 0 / 0
30.10.2021, 23:34
    #40108343
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку последних данных
Всем спасибо!
Нашлось приемлемое и достаточно простое решение нашлось:
Код: 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.
drop table #reports
go

create table #reports (
	[id] int, 
	[pid] int,
	[year] int,
	[month] tinyint,
	[data] nvarchar(32)
)
go
insert into #reports values (100202101, 100, 2021, 1, 'test-100-2021-1')
go
insert into #reports values (100202102, 100, 2021, 2, 'test-100-2021-2')
go
insert into #reports values (100202103, 100, 2021, 3, 'test-100-2021-3')
go
insert into #reports values (100202105, 100, 2021, 5, 'test-100-2021-3')
go
insert into #reports values (200202101, 200, 2021, 1, 'test-200-2021-1')
go
insert into #reports values (200202102, 200, 2021, 2, 'test-200-2021-2')
go
insert into #reports values (300202103, 300, 2021, 3, 'test-300-2021-3')
go
insert into #reports values (300202105, 300, 2021, 5, 'test-300-2021-5')
go


declare @p table(ch int primary key clustered)
insert @p values (100), (200), (300)

declare @m tinyint
declare @y int
set @m = 4
set @y = 2021

select [id], [pid], [year], [month], [data]
from (
	select row_number() over (partition by [pid] order by [year], [month] desc) as [rn], [id], [pid], [year], [month], [data]
	from #reports
	where [pid] in (select * from @p) and [year] = @y and [month] <= @m
) R
where R.[rn] = 1
order by [id] asc



Целью поисков был вот такой шаблон запроса для подстановок в приложении:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select [id], [pid], [year], [month], [data]
from (
	select row_number() over (partition by [pid] order by [year], [month] desc) as [rn], [id], [pid], [year], [month], [data]
	from %s
	where ([pid] in (%s)) and ([year] = %s) and ([month] <= %s)
) R
where R.[rn] = 1
order by [id] asc
...
Рейтинг: 0 / 0
30.10.2021, 23:45
    #40108349
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку последних данных
Возможно найдется более элегантное и оптимальное решение?!

Критика последнего варианта в части быстродействия приветствуется!
...
Рейтинг: 0 / 0
31.10.2021, 00:46
    #40108359
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку последних данных
Virtual Student
iap
Код: sql
1.
2.
3.
4.
SELECT TOP(1) WITH TIES *
FROM #reports
WHERE [year] = 2021 and [month]>=2
ORDER BY RANK()OVER(PARTITION BY [id] ORDER BY [data] DESC));

Если нужно по одной записи для каждого id, то замените RANK() на ROW_NUMBER().

Имею в виду, что у вас две записи имеют одну и ту же дату.

Большое спасибо за ответ!
Но, не взлетело... :(
В результате возвращается только одна запись, и только для одного id и для RANK() и для ROW_NUMBER().
Со сменой условия на [month] <= 2 - возвращается весь набор записей.

Да, нужно именно по одной, последней записи для набора id, если такие существуют.

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


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