powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите написать запрос
8 сообщений из 8, страница 1 из 1
Помогите написать запрос
    #39808674
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

Есть таблица с историей оценок студентов по разным предметам, по которой надо построить графики на определленном интервале, например с 1 января 2019г. по 25 апреля 2019.

Для этого надо найти последние значения оценок до 1-го января и все значения в указанном интервале. Сделать это надо одним запросом (можно использовать union).

Например в примере данных ниже для студента 123 по предметам 11, 12 и 13 нужно вернуть выделенные записи:
student_id subject_id score_date score
123 11 13/10/2018 61
123 12 21/10/2018 69
123 11 1/11/2018 75
123 12 9/12/2018 71
123 13 13/01/2019 83
123 11 1/02/2019 78
123 12 9/03/2019 75

123 11 29/04/2019 75
123 12 30/04/2019 71

При этом если дата до 1-го января, то ее надо заменить на 1-е января, то есть окончательный результат должен быть таким:
student_id subject_id score_date score
123 11 1/01/2019 75
123 12 1/01/2019 71
123 13 13/01/2019 83
123 11 1/02/2019 78
123 12 9/03/2019 75
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39808714
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m,

ну вы понимаете хотя бы начните
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39808791
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @b date = '20190101'
       , @e date = '20190425'
;

with t  as ( select * from [Есть таблица с историей оценок студентов по разным предметам] ) 
   , ss as ( select distinct student_id, subject_id from t where score_date between @b and @e ) -- студенты и предметы из интервала
   , dt as ( select ss.student_id, ss.subject_id, b = isnull( x.score_date, @b ) from ss outer apply ( select top(1) score_date from t where t.student_id = ss.student_id and t.subject_id = ss.subject_id and t.score_date <= @b order by t.score_date desc ) as x ) -- даты начала
   select dt.student_id, dt.subject_id, t.score_date. t.score
     from dt left outer join t on t.student_id = dt.student_id and t.subject_id = dt.subject_id and t.score_date >= dt.b and t.score_date < @e
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39808834
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @b date = '20190101'
       , @e date = '20190425'
;

with t  as ( select * from [Есть таблица с историей оценок студентов по разным предметам] ) 
   , ss as ( select distinct student_id, subject_id from t where score_date between @b and @e ) -- студенты и предметы из интервала
   , dt as ( select ss.student_id, ss.subject_id, b = isnull( x.score_date, @b ) from ss outer apply ( select top(1) score_date from t where t.student_id = ss.student_id and t.subject_id = ss.subject_id and t.score_date <= @b order by t.score_date desc ) as x ) -- даты начала
   select dt.student_id, dt.subject_id, t.score_date. t.score
     from dt left outer join t on t.student_id = dt.student_id and t.subject_id = dt.subject_id and t.score_date >= dt.b and t.score_date < @e



Не претензии ради а развития для. нахрена там лефт джоин, а не иннер?
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39808860
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
declare @DateStart date = ..., @DateFinish date= ...;

with t as
(
 select
  student_id, subject_id, score_date, score,
  row_number() over (partition by student_id, subject_id order by score_date) as rn
 from
  Таблица
 where
  score_date between @DateStart and @DateFinish
)
select
 t.student_id, t.subject_id, a.score_date, a.score
from
 t cross apply
 (
  select t.score_date, t.score
  union all
  select top (1)
   @DateStart, score
  from
   Таблица
  where
   t.rn = 1 and student_id = t.student_id and subject_id = t.subject_id and score_date < @DateStart
  order by
   score_date desc
 ) a;
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39808897
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посетительaleks222
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @b date = '20190101'
       , @e date = '20190425'
;

with t  as ( select * from [Есть таблица с историей оценок студентов по разным предметам] ) 
   , ss as ( select distinct student_id, subject_id from t where score_date between @b and @e ) -- студенты и предметы из интервала
   , dt as ( select ss.student_id, ss.subject_id, b = isnull( x.score_date, @b ) from ss outer apply ( select top(1) score_date from t where t.student_id = ss.student_id and t.subject_id = ss.subject_id and t.score_date <= @b order by t.score_date desc ) as x ) -- даты начала
   select dt.student_id, dt.subject_id, t.score_date. t.score
     from dt left outer join t on t.student_id = dt.student_id and t.subject_id = dt.subject_id and t.score_date >= dt.b and t.score_date < @e



Не претензии ради а развития для. нахрена там лефт джоин, а не иннер?

Ты ж понимаешь, по логике разницы нет.
Но давным-давно, в эпоху MS SQL 2000, обнаружилось, что в этом случае скан левой таблицы почти гарантирован.
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39809024
Gerros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы глумитесь над ним что ли?
Код: sql
1.
2.
3.
4.
5.
6.
select * from student_scores x
where score_date between '20190101' and '20190425'
   or score_date in( select top 1 score_date
from student_scores where score_date < '20190101'
and student_id = x.student_id and subject_id = x.subject_id
order by score_date desc)
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39809026
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GerrosВы глумитесь над ним что ли?
Код: sql
1.
2.
3.
4.
5.
6.
select * from student_scores x
where score_date between '20190101' and '20190425'
   or score_date in( select top 1 score_date
from student_scores where score_date < '20190101'
and student_id = x.student_id and subject_id = x.subject_id
order by score_date desc)



OR то зачем?
Сам ты глумишься.

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


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