Выберите значение для одной строки на основе других значений в других строках - PullRequest
0 голосов
/ 20 июня 2019

Это мой пример данных

RollNo   EnrollType   EnrollStart   EnrollEnd
---------------------------------------------
   1     Maths        1/Jan/2019    1/Jan/2020
   1     Science      1/Jun/2019    1/Jun/2020
   1     Social       2/Jun/2020    2/Jun/2021

В приведенной выше таблице в первых двух строках указывается, что учащийся изменил свой тип зачисления в первоначально предполагаемую дату окончания. Таким образом, эффективная дата его первого зачисления должна быть 1 июня 2019 года.

Запрос, над которым я работаю, заключается в извлечении данных, как указано выше. Так что экстракт должен

1    maths      1/Jan/2019    1/Jun/2019
1    science    1/Jun/2019    1/Jun/2020
1    social     2/Jun/2020    2/Jun/2021

Запрос, который я написал:

Select 
    rollno, enrolltype, enrollstart,
    case
       when (select count(*) from student 
             where enrollstart > s.enrollstart and enrollstart < s.enrollend) > 1 
          then
             (select top 1 enrollstart from student 
              where enrollstart > s.enrollstart and enrollstart < s.enrollend)
       else enrollend
    end
from 
    student s

Проблема в создании моей базы данных и реальных данных огромна, и этот запрос не кажется эффективным, так как он вызывает подзапрос дважды. Любой лучший способ извлечь это.

1 Ответ

1 голос
/ 20 июня 2019

Предполагая, что вы можете использовать lead()/lag():

select rollno, enrollstart,
    case when enrollend > lead(enrollstart) over (partition by rollno order by enrollstart)
        then lead(enrollstart) over (partition by rollno order by enrollstart) 
        else enrollend
    end
from student;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...