powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на выборку последних данных
8 сообщений из 8, страница 1 из 1
Запрос на выборку последних данных
    #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
Запрос на выборку последних данных
    #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
Запрос на выборку последних данных
    #40108306
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cross apply посмотри
...
Рейтинг: 0 / 0
Запрос на выборку последних данных
    #40108309
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
Запрос на выборку последних данных
    #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
Запрос на выборку последних данных
    #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
Запрос на выборку последних данных
    #40108349
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно найдется более элегантное и оптимальное решение?!

Критика последнего варианта в части быстродействия приветствуется!
...
Рейтинг: 0 / 0
Запрос на выборку последних данных
    #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
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на выборку последних данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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