Sql 查找不连续的用户记录

Sql 查找不连续的用户记录,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我不知道如何开始这个查询 我有一个包含以下列和数据的表: User BeginMile EndMile 1 1 5 1 5 6 1 6 20 1 20 25 1 25 29 2 1 9 2 15 20 3 1 2 3 6 1

我不知道如何开始这个查询

我有一个包含以下列和数据的表:

User   BeginMile EndMile
1         1        5
1         5        6
1         6        20
1         20       25
1         25       29
2         1         9
2         15        20
3         1         2
3         6         10
3         10        12
我需要首先找到每个用户从上一条记录的结束英里到下一条记录的开始英里之间的差距。然后,我需要在每个用户出现间隙之前和之后返回记录

在前面的数据示例中,我希望返回以下内容:

User   PrevBeginMile   PrevEndMile    AfterBeginMile AfterEndMile   Gap
2         1                9                15          20           6
3         1                2                6           10           4

如何做到这一点?

考虑到您使用的是SQL 2005,这应该可以:

DECLARE @Runners TABLE (Id INT, BeginMile INT, EndMile INT)

INSERT INTO @Runners VALUES (1,1,5)
INSERT INTO @Runners VALUES (1,5,6)
INSERT INTO @Runners VALUES (1,6,20)
INSERT INTO @Runners VALUES (1,20,25)
INSERT INTO @Runners VALUES (1,25,29)
INSERT INTO @Runners VALUES (2,1,9)
INSERT INTO @Runners VALUES (2,15,20)
INSERT INTO @Runners VALUES (3,1,2)
INSERT INTO @Runners VALUES (3,6,10)
INSERT INTO @Runners VALUES (3,10,12)

WITH OrderedUsers AS (
    SELECT  *
    ,   ROW_NUMBER() OVER (PARTITION BY Id ORDER BY BeginMile) RowNum
    FROM    @Runners
)

SELECT  a.Id [User]
,   a.BeginMile PrevBeginMile
,   a.EndMile PrevEndMile
,   b.BeginMile AfterBeginMile
,   b.EndMile AfterEndMile
,   b.BeginMile - a.EndMile Gap
FROM    OrderedUsers a
JOIN    OrderedUsers b
ON  a.Id = b.Id
AND a.EndMile <> b.BeginMile
AND a.RowNum = b.RowNum - 1

除了使用RowNumber[在其他答案中一样],您还可以使用

SELECT
  [current].User,
  [current].BeginMile                   AS [PrevBeginMile],
  [current].EndMile                     AS [PrevEndMile],
  [next].BeginMile                      AS [AfterBeginMile],
  [next].EndMile                        AS [AfterEndMile],
  [next].BeginMile - [current].EndMile  AS [Gap]
FROM
  myTable AS [current]
CROSS APPLY
  (SELECT TOP 1 * FROM myTable WHERE user = [current].User AND BeginMile > [current].BeginMile ORDER BY BeginMile ASC) AS [next]
WHERE
 [current].EndMile <> [next].BeginMile
怎么样

WITH acte(user,beginmile,endmile) AS
(
SELECT user,start,end
ROW_NUMBER() OVER(PARTITION BY user ORDER BY START ASC) rownum
FROM mytable
)
SELECT base.user,base.beginmile,base.endmile,base.BeginMile - lead.EndMile Gap 
FROM acte base 
LEFT JOIN acte lead on base.id=lead.id AND base.rownum=lead.rownum-1
WHERE base.BeginMile - lead.EndMile > 0

开始和结束日期?你是说开始和结束?哎呀。编辑为Begin/endmile您是如何订购表格的?它可以由用户订购,BeginMile,endmile我将用CTE替换两个子查询;以ordered_table为例,从ordered_table中选择blah作为blah de上的b作为内部联接ordered_table-blah@Dems-好建议。更新。
WITH acte(user,beginmile,endmile) AS
(
SELECT user,start,end
ROW_NUMBER() OVER(PARTITION BY user ORDER BY START ASC) rownum
FROM mytable
)
SELECT base.user,base.beginmile,base.endmile,base.BeginMile - lead.EndMile Gap 
FROM acte base 
LEFT JOIN acte lead on base.id=lead.id AND base.rownum=lead.rownum-1
WHERE base.BeginMile - lead.EndMile > 0