2016-04-28 6 views
0

Как написать запрос, который вернет следующую дату.SQL Query to Show next date

Вот пример, я хочу запросить для заполнения столбца next_date

Благодарности

Employee_ID Date  Point  Next_Date 
53    07/31/2015 1   12/02/2015 
53    12/02/2015 1   01/12/2016 
53    01/12/2016 1   02/10/2016 
53    02/10/2016 1   

я использовал следующий запрос, но получение Null

SELECT 
    TOP 1 att.attend_date 
FROM 
    Attendance att 
WHERE 
    att.ID_Employee=att.ID_Employee and 
    att.attend_date > att.attend_date 
ORDER BY 
      att.attend_date ASC 
+1

Какая СУБД вы используете? –

+1

Я не буду хранить эти значения Next_Date в таблице, слишком высокий риск несогласованности данных при добавлении/удалении/обновлении строк. Вместо этого создайте представление, в котором всегда есть согласованные данные! (Или управляйте триггерами.) – jarlh

+0

спасибо всем, используя SQL Server – jsmabbas

ответ

1

Ведущий должен работать, в зависимости от БД вы используете.

select 
    employee_id, 
    date, 
    point, 
    lead(date) over (partition by employee_id order by date) as next_date 
from your_table 
+0

Спасибо mo2 работает как шарм – jsmabbas

+0

Как насчет next_date на основе employee_ID, например. У меня есть несколько сотрудников, и я хочу проверить их на следующий день. – jsmabbas

+0

Отредактировал запрос выше. Если вы разделяете employee_id, то он даст вам только следующую_дату для того же employee_id. Для последней строки для каждого employee_id next_date будет NULL. – mo2

0

Вам нужен столбец, чтобы указать порядок, поскольку таблица не имеет неотъемлемого порядка. Кажется, что он не был заказан Date-column, иначе ваши первые две записи будут иметь неправильный Next_Date, поскольку они в прошлом.

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

Затем вы можете использовать этот запрос (TOP предполагает SQL-сервер, так что должно быть изменено в других RDBMS):

UPDATE t SET Next_Date = (SELECT TOP 1 t2.Date 
          FROM TableName t2 
          WHERE t2.ID > t.ID) 
FROM TableName t 
WHERE t.Next_Date IS NULL 
0

Предполагая, что вы используете SQL Server можно использовать row_number, чтобы найти следующую строку, которая соответствует вашему условию.

WITH assignmentsSubQuery as 
(
    select row_number() over (partition by Employee_ID order by date desc) as rowId, employee_id, date AS Next_Date 
    from Assignments 
) 
UPDATE 
    A 
set 
    A.Next_Date = A2.Next_Date 
from 
    Assignments A inner join 
    assignmentsSubQuery A1 on (A.employee_id = a1.Employee_ID and A.[Date] = A1.Next_Date) inner join 
    assignmentsSubQuery A2 on (A1.employee_id = a2.Employee_ID and A1.rowId = A2.rowId + 1)