Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите написать запрос  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1090
Добрый день,

Есть таблица с историей оценок студентов по разным предметам, по которой надо построить графики на определленном интервале, например с 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
1 май 19, 07:39    [21876124]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
Roust_m,

ну вы понимаете хотя бы начните
1 май 19, 09:49    [21876172]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
aleks222
Member

Откуда:
Сообщений: 847
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
1 май 19, 13:14    [21876282]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
aleks222
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


Не претензии ради а развития для. нахрена там лефт джоин, а не иннер?
1 май 19, 14:34    [21876343]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
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;
1 май 19, 15:58    [21876384]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
aleks222
Member

Откуда:
Сообщений: 847
Посетитель
aleks222
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, обнаружилось, что в этом случае скан левой таблицы почти гарантирован.
1 май 19, 17:19    [21876435]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Gerros
Member

Откуда: Харьков
Сообщений: 501
Вы глумитесь над ним что ли?
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)
2 май 19, 03:21    [21876639]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
aleks222
Member

Откуда:
Сообщений: 847
Gerros
Вы глумитесь над ним что ли?
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 то зачем?
Сам ты глумишься.

ЗЫ. Искусство коррелированных запросов ныне утрачено.
2 май 19, 06:12    [21876650]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить