日期:2014-05-16  浏览次数:20717 次

求SQL,最后一条记录和上次出现记录之间间隔了多少条记录.
id ip
1 a
2 b
3 c
5 d
6 a

其中id自增(有可能被删除,所以不能用id相减),比如最近一条记录ip是a,经过查询,最近一次出现a是id为1的记录。之间间隔了4条记录。

特来求大伙来帮给个思路,谢谢了。
------解决方案--------------------


DECLARE @t Table (
ID INT NOT NULL, 
IP varchar(200) NOT NULL 
)

INSERT @t 
SELECT 1 AS [ID], 'a' AS [IP] 
UNION ALL 
SELECT 2 AS [ID], 'c' AS [IP] 
UNION ALL 
SELECT 3 AS [ID], 'b' AS [IP] 
UNION ALL 
SELECT 5 AS [ID], 'd' AS [IP] 
UNION ALL 
SELECT 6 AS [ID], 'a' AS [IP] 
UNION ALL 
SELECT 8 AS [ID], 'c' AS [IP] 
UNION ALL 
SELECT 9 AS [ID], 'b' AS [IP] 

SELECT COUNT(t.ID) 
FROM @t t ,  (SELECT L.ID AS LastID, ISNULL(S.ID,0) AS SecondID 
FROM (SELECT TOP 1 ID, IP FROM @t t WHERE IP='a' ORDER BY ID DESC) L 
OUTER APPLY (SELECT TOP 1 ID FROM @t t WHERE IP='a' AND ID<>L.ID ORDER BY ID DESC)  S 
) O 
WHERE t.ID >=O.SecondID AND t.ID<O.LastID 


------解决方案--------------------
既然2008,你用row_number在查找的时候生成一个连续的序列,就可以获取顺序的
------解决方案--------------------

DECLARE @t Table (
ID INT NOT NULL, 
IP varchar(200) NOT NULL 
)
 
INSERT @t 
SELECT 1 AS [ID], 'a' AS [IP] 
UNION ALL 
SELECT 2 AS [ID], 'c' AS [IP] 
UNION ALL 
SELECT 3 AS [ID], 'b' AS [IP] 
UNION ALL 
SELECT 5 AS [ID], 'd' AS [IP] 
UNION ALL 
SELECT 6 AS [ID], 'a' AS [IP] 
UNION ALL 
SELECT 8 AS [ID], 'c' AS [IP] 
UNION ALL 
SELECT 9 AS [ID], 'b' AS [IP] 
UNION ALL 
SELECT 15 AS [ID], 'b' AS [IP] 
UNION ALL 
SELECT 18 AS [ID], 'd' AS [IP] 

 
select r.IP,r2.Counts 
from (
 select IP,MAX(ID) as MaxId,MIN(id) MinId from @t 
 group by IP ) r
 Outer Apply (
select COUNT(1) as Counts from @t where ID between r.MinId and r.MaxId -1 
 ) r2
 

比1楼简单点