我有一個數據表。我有一個顯示日期的字段。我已將此欄設置爲「開始日期」。我想創建一個額外的列作爲結束日期,其中結束日期將是下一行的開始日期。你可以通過獲取下一行中的開始日期的數據給我一個創建結束日期的查詢嗎?從下一行動態創建新的日期字段
回答
假設你已經有你的列和你有一個自動遞增的主鍵:
Update T1
Set T1.EndDate = T2.StartDate
From [Table] T1
Inner Join [Table] T2 on T1.Id = T2.Id - 1
這不考慮自動遞增鍵...我必須從下一行 – 2010-07-29 18:37:19
的開始日期得到結束日期,非常感謝....這對我來說是成功的! – 2010-08-02 09:39:57
取決於「下一個」行的含義。
您能否提供樣本數據集,並指定您如何確定行進入的順序?
編輯
不管你創紀錄的訂單確實 - 你將必須確定那是什麼。就目前而言,我正在嘗試按照start_date排序它是可以接受的。
--GET the first relevant start date
declare @start datetime
set @start = select MIN(start_date) from table
declare @end datetime
set @end = @start
WHILE @end is not null
--GET the next relevant end date
SET @end = select MIN(start_date) from table where start_date > @start
--Update the table with the end date
UPDATE table
SET end_date = @end
WHERE start_date = @start
--GET the next relevant start date
SET @start = @end
END
請檢查第一個答案。示例輸出已給出。 – 2010-07-29 18:39:16
*先*回答,呃? :-)他們總是改變秩序。 Anyhoo - 我在上面編輯了我的答案,基於假設「下一個」行由start_date命令確定。 – dave 2010-07-29 20:24:45
首先,由於表中的行沒有任何順序存儲,所以您必須提出「訂單」的定義。
當你知道你的順序是什麼,你可以創建一個存儲過程,雲:
insert into the_table (new_id, start_date) values (@id, @start_date);
update the_table
set end_date = @start_date
where id = <the id determined by your sorting rule>;
什麼最後一排?結束日期將是空白的?
多數民衆贊成在我想要的結果就像上面的第一個答案對我的問題。什麼是查詢來計算結束日期? – 2010-07-29 18:41:47
我假設您目前有值,如
StartDate
---------
1 Jan 1990
2 June 1998
4 September 2006
你行想改成
StartDate EndDate
--------- ------------
1 Jan 1990 2 June 1998
2 June 1998 4 September 2006
4 September 2006 NULL
不僅僅是冗餘和維護這個問題讓我想起了this question這樣的設置與相關的列實際上導致了原始的海報問題,當查詢數據。 (我更喜歡Unreason's answer對我自己的那個問題!)
爲什麼你需要添加EndDate
列?它可能會提出一個沒有它的查詢。
編輯經過很多與row_number()
faffing我實際上找不到一個更好的計劃比這個查詢。 (假設上StartDate
指數)
SELECT
id,
StartDate,
(SELECT MIN(StartDate)
FROM testTable t2
WHERE t2.StartDate > t1.StartDate) AS EndDate
FROM testTable t1
是的,這是我想要的輸出。在我的工作中,我們需要這個結束日期。 – 2010-07-29 18:32:17
以及如何得到它? – 2010-07-29 18:34:34
@sreejesh - 你在做什麼類型的查詢?你是否帶回一系列結果或查找單個記錄? – 2010-07-29 18:48:18
我回答這個問題,因爲它是被引用的其他地方。
根據id
沒有孔是危險的。 identity
列可能有空隙,目前接受的答案沒有考慮到。
在SQL Server 2012+中,答案僅僅是lag()
。在table(StartDate)
Update T1
Set T1.EndDate = T2.StartDate
From [Table] T1 cross apply
(select top 1 t2.*
from [Table] T2
where t2.StartDate > t1.Startdate
order by t2.StartDate asc
) t2;
與索引,這也有可能獲得合理的性能:在早期版本中,你可以使用cross apply
。
我認爲這應該是'where t2.StartDate> t1.Startdate'?你只需要't.StartDate' – sab669 2015-11-03 14:48:17
@ sab669。 。 。是。順序方向也是錯誤的(應該是'asc'而不是'desc')。 – 2015-11-03 19:36:31
- 1. 動態創建的字段
- 2. 從另一個表中的MAX日期更新日期字段
- 3. 計算從動態創建的div一個新的日期值中,
- 4. Tabindex動態創建字段
- 5. mongoDB動態創建字段
- 6. 帶日期字段的動態Linq
- 7. 擴展Javascript日期以創建一個新的日期從字符串
- 8. 創建日期的動態列表
- 9. 刷新一個動態創建的字段集
- 10. 從動態創建的日期選擇器字段中減去日期和時間
- 11. PHP從出生日期多個字段創建一個新變量
- 12. 如何創建一個動態創建的字段/元素?
- 13. Java - 創建oracle日期字段
- 14. SharePoint 2007創建日期查找字段
- 15. 如何在給定基準日期時從Java中動態創建日期字段?
- 16. 更新字段,其中一個日期字段小於其他日期字段
- 17. 如何使用SQLITE 3創建更新的「日期」字段?
- 18. 日期創建日期和上一次更新日期爲MySQL
- 19. 在MySQL中創建動態日期
- 20. SQL:動態創建日期問題
- 21. 從另一個類型的日期創建一個新的類型日期列
- 22. 使用新動態創建的字段更新模型對象?
- 23. 動態SQL動態地從字段值創建列名
- 24. SQL從年份和數字字段創建日期時間
- 25. MySQL自動更新日期字段
- 26. 根據文本字段中的日期創建活動
- 27. Android:刪除動態創建的字段
- 28. 讀取動態創建的字段
- 29. sql從字段創建一個字段
- 30. 在Kibana將現有的時間戳創建一個新的日期字段5.0.0
如果可以從下一行計算出來,您可能不需要存儲它。 – 2010-07-29 17:55:27