2016-04-28 15 views
0

如何編寫將返回下一個日期的查詢。SQL查詢以顯示下一個日期

這裏是例子,我想查詢來填充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   

我用下面的查詢,但得到空

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

您正在使用哪些DBMS? –

+1

我不會在表中存儲Next_Date值,當添加/刪除/更新行時,數據不一致的風險太高。而是創建一個始終具有一致數據的視圖! (或通過觸發器管理) – jarlh

+0

感謝所有使用SQL Server – jsmabbas

回答

1

鉛應該工作,這取決於DB所使用。

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

如何根據employee_ID例如next_date我有一個以上的員工,我想檢查他們的第二天 – jsmabbas

+0

編輯上面的查詢。如果你通過employee_id進行分區,那麼它只會給你同一個employee_id的next_date。對於每個employee_id的最後一行,next_date將爲NULL。 – mo2

0

你需要一個列指定由於表格沒有固有的順序,所以訂單。它看起來不是由Date專欄訂購的,否則你的前兩個記錄將會錯誤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)