作者diamondking (迷惘)
看板Database
標題Re: [SQL ] 算出每筆日期間隔
時間Sat Jul 12 02:37:01 2014
其實是可以做到的,
概念是用分組排序,來找出與自己日期相差最少的,即是自己的"下一筆"。
手邊沒有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
→ Severine:謝謝 這篇我得花時間看懂>< 依照原文底下的推文已經實做 07/12 21:27
→ Severine:出來了~ 07/12 21:27
推 hhomerun:這位大大的答案 在2008(含2008)前的版本恐怕會無法使用 07/13 01:09
→ diamondking:查了MSDN,應該從2005就有了 07/14 01:55
→ hhhomerun:你認真的嗎............ 07/14 01:59
推 TeemingVoid:row_number(), partition by 的確是 SQL 2005 新功能 07/14 20:45
→ hhomerun:但是partition和order同時in over .....好像不是喔 07/14 23:34
→ hhomerun:諸位可能要再去查查 07/14 23:35
推 TeemingVoid:rank() over (partition ... order...) 我在 2006 年 07/15 12:05
→ TeemingVoid:的系統就確定用過了。如果您比較相信「查」的,請看: 07/15 12:06
→ TeemingVoid:下載研討會範例後, 其中 EasyRank.txt 有示範。 07/15 12:06
→ hhomerun:......你找兩個完全回答問題的連結= = 07/15 23:43
→ hhomerun: 完全不能回答 07/15 23:44
推 TeemingVoid:我沒要回答原PO的問題,而是針對h您說的提出澄清: 07/16 00:57
→ TeemingVoid:SQL 2005 確實已支援 row_number() over (...) 功能 07/16 00:57
→ TeemingVoid:我兩個連結都不是解決問題,但都能說明SQL2005已支援 07/16 00:57
→ TeemingVoid:您「好像...」的功能。以下還有一段舊影片,當時是在 07/16 00:58
→ TeemingVoid:究竟h大有沒有在 SQL 2005 實際上機試過這項功能? 07/16 00:58
→ Severine:不要為了我吵架~~~ (誤 07/17 14:33
→ Severine:我的問題已經解完了 謝謝大家的幫忙 >< 07/17 14:33
→ Severine:原本想試試看各位大大在討論的東西 可是發現我是SQLAzure 07/17 14:38
→ Severine:應該早就超過SQL2005了orz 07/17 14:39