2016-06-02 1 views
0

У меня есть таблица здесь (показано ниже), которая имеет фазу и время ее запуска. То, что я пытаюсь выполнить, - это , чтобы использовать время фазы, следующего за предыдущей фазой, как время окончания предыдущей фазы.Как достичь времени начала другой переменной в качестве конечного времени переменной, которая перед ней?

Так что сейчас у меня есть:

rownum PhaseName PhaseID  Time     TimeEnd 

1  Air Removal   2 2016-06-01 11:46:46.000 2016-06-01 11:46:46.000 

2  Heat up    3 2016-06-01 11:56:47.000 2016-06-01 11:56:47.000 

3  Steriliztion   4 2016-06-01 12:06:17.000 2016-06-01 12:06:17.000 

4  Air Pressurization 5 2016-06-01 12:23:40.000 2016-06-01 12:23:40.000 

5  Exhaust    6 2016-06-01 12:27:18.000 2016-06-01 12:27:18.000 

6  Drying    7 2016-06-01 12:29:35.000 2016-06-01 12:29:35.000 

7  Equalization   8 2016-06-01 12:34:36.000 2016-06-01 12:34:36.000 

И я хотел бы сделать это:

rownum PhaseName PhaseID  Time     TimeEnd 

1  Air Removal   2 2016-06-01 11:46:46.000 2016-06-01 11:56:47.000 

2  Heat up     3 2016-06-01 11:56:47.000 2016-06-01 12:06:17.000 

3  Steriliztion   4 2016-06-01 12:06:17.000 2016-06-01 12:23:40.000 

4  Air Pressurization 5 2016-06-01 12:23:40.000 2016-06-01 12:27:18.000 

5  Exhaust    6 2016-06-01 12:27:18.000 2016-06-01 12:29:35.000 

6  Drying    7 2016-06-01 12:29:35.000 2016-06-01 12:34:36.000 

7  Equalization   8 2016-06-01 12:34:36.000 2016-06-01 12:34:36.000 

- Последняя фаза без конца недели ...

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

+0

Вы, кажется, говорите, что в своем окончательном CTE - назовем это CTE, что вы хотите сделать – Cato

+0

Извините за плохой английский, мой CTE иметь 10 меня туда, где у меня есть время начала, когда происходит каждая фаза. Теперь я хотел бы каким-то образом манипулировать моим запросом, чтобы также включить столбец (Time End), который имеет конец времени для каждой фазы. Конец времени будет временем, когда фаза, начавшаяся после предыдущей фазы, начнется. –

ответ

0

Я использовал эти аналитические функции только в Oracle, но SQL Server имеет те же функции, что и LAG и LEAD, где LAG просматривает строку перед текущей строкой, а LEAD смотрит на строку после текущей строки.

Вот пример синтаксиса, в котором функция смотрит на TimeEnd прошлой строки и устанавливает ее как TimeStart на основе PhaseID (или RowID, поскольку оба являются последовательными и упорядочивают строки одинаково).

SELECT LAG(TimeEnd, 1) OVER (ORDER BY PhaseID) TimeStart 

Вот еще информация об этих аналитических функций: http://blog.sqlauthority.com/2011/11/15/sql-server-introduction-to-lead-and-lag-analytic-functions-introduced-in-sql-server-2012/

EDIT: Эти функции только в SQL Server 2012 и далее, но я нашел статью, в которой описывается, как имитировать эти функции в более ранних версиях SQL Server с помощью CTE, например, вы делали: http://www.databasejournal.com/features/mssql/lead-and-lag-functions-in-sql-server-2012.html

+1

Будьте осторожны, OP не указал, какую версию SQL Server у них есть. Ваш ответ не будет работать над версиями до SQL Server 2012. Было бы целесообразно отредактировать ваш ответ и добавить предостережение, что это будет работать только для SQL Server 2012 и выше. – BeaglesEnd

+1

Спасибо, буду. Я также нашел статью о том, как это сделать в предыдущих версиях SQL Server, поэтому, если OP использует более раннюю версию, возможно, он сможет ее использовать. – kayla210

+1

Привет, ребята, я использовал функцию Lead, чтобы решить большую часть моей проблемы, все еще есть ошибки, которые мне нужно решать, но эта проблема была решена. Я также ценю две статьи, в которых используются функции Lead/lag и другая статья для выполнения работы без двух функций.Они помогают, потому что у меня есть сервер 2014 sql, а также сервер SQL 2008, который используется для разных клиентов. Так что спасибо! –

0

вы, кажется, говорят, что в вашем окончательном КТР - давайте назовем это CTE, что вы хотите сделать
.... FROM КТР LEFT JOIN CTE2 ON CTE.rownum = CTE2.Rownum + 1

по умолчанию нижнее правое значение (которое будет null) использовать COALESCE (CTE2.TimeEnd, CTE1.TimeEnd)

Смежные вопросы