作者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://webptt.com/cn.aspx?n=bbs/Database/M.1405103824.A.F00.html
1F:→ Severine:谢谢 这篇我得花时间看懂>< 依照原文底下的推文已经实做 07/12 21:27
2F:→ Severine:出来了~ 07/12 21:27
3F:推 hhomerun:这位大大的答案 在2008(含2008)前的版本恐怕会无法使用 07/13 01:09
4F:→ diamondking:查了MSDN,应该从2005就有了 07/14 01:55
5F:→ hhhomerun:你认真的吗............ 07/14 01:59
6F:推 TeemingVoid:row_number(), partition by 的确是 SQL 2005 新功能 07/14 20:45
7F:→ hhomerun:但是partition和order同时in over .....好像不是喔 07/14 23:34
8F:→ hhomerun:诸位可能要再去查查 07/14 23:35
9F:推 TeemingVoid:rank() over (partition ... order...) 我在 2006 年 07/15 12:05
10F:→ TeemingVoid:的系统就确定用过了。如果您比较相信「查」的,请看: 07/15 12:06
12F:→ TeemingVoid:下载研讨会范例後, 其中 EasyRank.txt 有示范。 07/15 12:06
14F:→ hhomerun:......你找两个完全回答问题的连结= = 07/15 23:43
15F:→ hhomerun: 完全不能回答 07/15 23:44
18F:推 TeemingVoid:我没要回答原PO的问题,而是针对h您说的提出澄清: 07/16 00:57
19F:→ TeemingVoid:SQL 2005 确实已支援 row_number() over (...) 功能 07/16 00:57
20F:→ TeemingVoid:我两个连结都不是解决问题,但都能说明SQL2005已支援 07/16 00:57
21F:→ TeemingVoid:您「好像...」的功能。以下还有一段旧影片,当时是在 07/16 00:58
23F:→ TeemingVoid:究竟h大有没有在 SQL 2005 实际上机试过这项功能? 07/16 00:58
24F:→ Severine:不要为了我吵架~~~ (误 07/17 14:33
25F:→ Severine:我的问题已经解完了 谢谢大家的帮忙 >< 07/17 14:33
26F:→ Severine:原本想试试看各位大大在讨论的东西 可是发现我是SQLAzure 07/17 14:38
27F:→ Severine:应该早就超过SQL2005了orz 07/17 14:39