Re: [SQL ] 算出每筆日期間隔

看板Database (資料庫)作者 (迷惘)時間9年前 (2014/07/12 02:37), 編輯推噓6(6021)
留言27則, 5人參與, 最新討論串3/5 (看更多)
其實是可以做到的, 概念是用分組排序,來找出與自己日期相差最少的,即是自己的"下一筆"。 手邊沒有MSSQL,憑空寫不確定有沒有錯,請試試看: SELECT Date1 [Date], Orders, daydiff NextDataDayDiff FROM ( SELECT Date1, Orders, daydiff , Row_Number() OVER (PARTITION BY Date1 ORDER BY daydiff) RW FROM ( SELECT t1.Date Date1, t2.Date Date2, t1.Orders , datediff(day,t1.Date ,t2.Date) AS daydiff FROM @Temp t1 with(nolock) LEFT JOIN @Temp t2 with(nolock) ON t1.Date<t2.Date ) temp ) temp WHERE RW=1 ※ 引述《Severine (賽非茵)》之銘言: : DB: MS SQL : 估狗了很久 剛剛也在本版搜尋了一下類似問題 找不太到.. : 只好發文問一下! : 我想要取得每筆紀錄的時間間隔 請問該怎麼做呢? : ========================================================= : 問完以後改寫了一個blueshop的範例 : DECLARE @Temp table (Date datetime, Orders int) : INSERT INTO @Temp VALUES ('2012/2/1',1000) : INSERT INTO @Temp VALUES ('2012/2/2',800) : INSERT INTO @Temp VALUES ('2012/2/3',3500) : INSERT INTO @Temp VALUES ('2012/2/4',4000) : SELECT : T1.Date , : ISNULL(datediff(day,T2.Date ,T1.Date),null) AS daydiff : FROM @Temp AS T1 : LEFT JOIN @Temp AS T2 ON T1.Date = DATEADD(d,1,T2.Date) : ===============以上可以算出後四筆的相差時間============== : 但是以下就不行,想必是對left join用法的理解錯誤 : DECLARE @Temp table (Date datetime, Orders int) : INSERT INTO @Temp VALUES ('2012/2/1',1000) : INSERT INTO @Temp VALUES ('2012/2/12',800) <=修改過 : INSERT INTO @Temp VALUES ('2012/2/13',3500) <= : INSERT INTO @Temp VALUES ('2012/2/24',4000) <= : SELECT : T1.Date , : ISNULL(datediff(day,T2.Date ,T1.Date),null) AS daydiff : FROM @Temp AS T1 : LEFT JOIN @Temp AS T2 ON T1.Date = DATEADD(d,1,T2.Date) : ======================================================== : 請問該如何修改呢? 謝謝 >< -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.166.90.109 ※ 文章網址: http://www.ptt.cc/bbs/Database/M.1405103824.A.F00.html

07/12 21:27, , 1F
謝謝 這篇我得花時間看懂>< 依照原文底下的推文已經實做
07/12 21:27, 1F

07/12 21:27, , 2F
出來了~
07/12 21:27, 2F

07/13 01:09, , 3F
這位大大的答案 在2008(含2008)前的版本恐怕會無法使用
07/13 01:09, 3F

07/14 01:55, , 4F
查了MSDN,應該從2005就有了
07/14 01:55, 4F

07/14 01:59, , 5F
你認真的嗎............
07/14 01:59, 5F

07/14 20:45, , 6F
row_number(), partition by 的確是 SQL 2005 新功能
07/14 20:45, 6F

07/14 23:34, , 7F
但是partition和order同時in over .....好像不是喔
07/14 23:34, 7F

07/14 23:35, , 8F
諸位可能要再去查查
07/14 23:35, 8F

07/15 12:05, , 9F
rank() over (partition ... order...) 我在 2006 年
07/15 12:05, 9F

07/15 12:06, , 10F
的系統就確定用過了。如果您比較相信「查」的,請看:
07/15 12:06, 10F

07/15 12:06, , 11F
07/15 12:06, 11F

07/15 12:06, , 12F
下載研討會範例後, 其中 EasyRank.txt 有示範。
07/15 12:06, 12F

07/15 12:11, , 13F
上述 http://ppt.cc/DGI8 沒有 ( 左括號喔
07/15 12:11, 13F

07/15 23:43, , 14F
......你找兩個完全回答問題的連結= =
07/15 23:43, 14F

07/15 23:44, , 15F
完全不能回答
07/15 23:44, 15F

07/15 23:46, , 17F
07/15 23:46, 17F

07/16 00:57, , 18F
我沒要回答原PO的問題,而是針對h您說的提出澄清:
07/16 00:57, 18F

07/16 00:57, , 19F
SQL 2005 確實已支援 row_number() over (...) 功能
07/16 00:57, 19F

07/16 00:57, , 20F
我兩個連結都不是解決問題,但都能說明SQL2005已支援
07/16 00:57, 20F

07/16 00:58, , 21F
您「好像...」的功能。以下還有一段舊影片,當時是在
07/16 00:58, 21F

07/16 00:58, , 22F
SQL 2005 示範此一功能: http://ppt.cc/nbbU
07/16 00:58, 22F

07/16 00:58, , 23F
究竟h大有沒有在 SQL 2005 實際上機試過這項功能?
07/16 00:58, 23F

07/17 14:33, , 24F
不要為了我吵架~~~ (誤
07/17 14:33, 24F

07/17 14:33, , 25F
我的問題已經解完了 謝謝大家的幫忙 ><
07/17 14:33, 25F

07/17 14:38, , 26F
原本想試試看各位大大在討論的東西 可是發現我是SQLAzure
07/17 14:38, 26F

07/17 14:39, , 27F
應該早就超過SQL2005了orz
07/17 14:39, 27F
文章代碼(AID): #1Jm2xGy0 (Database)
文章代碼(AID): #1Jm2xGy0 (Database)