SQL Server:查找2行之间的行

时间:2017-12-07 16:52:05

标签: sql-server sql-server-2012

修改以更准确地表示我想要解决的问题。我第一次简化了这个问题。

我有2个SQL Server 2012表,其数据如下:

表CommitBranch

Hash                                        HashDate                 BranchName
-----------------------------------------------------------------------------------
4191737d919e599690a8b9efd691ffc5165908f9    2013-01-26 15:24:44.000  B1
4191737d919e599690a8b9efd691ffc5165908f9    2013-01-26 15:24:44.000  B2
59503c5e22914b4926e8b5352ef254ebf67b1245    2013-01-28 19:28:12.000  B1
b3052d0c950a731d7221bab8825ba5787a9eb372    2013-01-29 17:05:02.000  B1
54752ce05b2c7784ff22c6161f9ecc33d4b1149f    2013-01-29 17:42:16.000  B2
d7c008d807d3439539b98dccf4c93ee6bc33405c    2013-01-29 21:29:32.000  B1
c890ca6ab1735ee391407ca80aa789a560632709    2013-01-31 04:39:57.000  B2
bf75a42b88782b0dc084a5642cc98876ad3ef41d    2013-01-31 04:41:30.000  B3
e54982d42d2b87e35d47536cd2017c18117afc28    2013-01-31 15:54:20.000  B1
e54982d42d2b87e35d47536cd2017c18117afc28    2013-01-31 15:54:20.000  B2    
e54982d42d2b87e35d47536cd2017c18117afc28    2013-01-31 15:54:20.000  B3

Hash和BranchName是主键。

表格构建

BuildID  LastCommitHash                            BranchName 
------------------------------------------------------------
1        4191737d919e599690a8b9efd691ffc5165908f9  B1
2        b3052d0c950a731d7221bab8825ba5787a9eb372  B1
3        e54982d42d2b87e35d47536cd2017c18117afc28  B1
4        bf75a42b88782b0dc084a5642cc98876ad3ef41d  B3

LastCommitHash是在创建Build时使用的CommitBranch记录的哈希值。请注意,并非每个Commit哈希都会出现在Build表中 - 如示例所示,将存在间隙(例如,缺少59503c5e22914b4926e8b5352ef254ebf67b1245)。对于CommitBranch表唯一可靠的排序是HashDate - 散列本身实际上是随机的。

我正在尝试编写一个在名为BuildCommit的视图中使用的查询,以便在Build表中的LastCommitHash和Previous Build的LastCommitHash之间提供所有的CommitBranch记录(但不包括该构建)。我基本上试图回答这个问题,自上次构建以来,该分支上的提交是什么。

查询将返回以下内容:

BuildID CommitHash                                  BranchName
------------------------------------------------------------------
1       4191737d919e599690a8b9efd691ffc5165908f9    B1
2       b3052d0c950a731d7221bab8825ba5787a9eb372    B1
2       59503c5e22914b4926e8b5352ef254ebf67b1245    B1
3       e54982d42d2b87e35d47536cd2017c18117afc28    B1
3       d7c008d807d3439539b98dccf4c93ee6bc33405c    B1
4       bf75a42b88782b0dc084a5642cc98876ad3ef41d    B3
...

必须处理边缘条件(例如,只有1个分支构建,因此没有"因为"记录)。

迄今为止的答案都很有帮助和赞赏,但遗憾的是,由于我过度简化了原始问题,因此我所需要的并不完全。

提前致谢!

2 个答案:

答案 0 :(得分:1)

试试这个

open("/dev/chardevice", "r+b", 0)

答案 1 :(得分:1)

您可以执行以下操作。根据需要修改此查询

DECLARE @StartHash char(40) = 'bf75a42b88782b0dc084a5642cc98876ad3ef41d'
DECLARE @EndHash char(40) = 'b3052d0c950a731d7221bab8825ba5787a9eb372'

    ;WITH CTE AS 
    (
        SELECT *, ROW_NUMBER() OVER(ORDER BY H.HashDate) N
        FROM HASHTABLE H
    )
    SELECT [Hash], [HashDate]
    FROM CTE
    WHERE EXISTS(SELECT 1 FROM CTE CMAX WHERE CMAX.[Hash] = @EndHash AND CMAX.N <= CTE.N)
          AND EXISTS(SELECT 1 FROM CTE CMIN WHERE CMIN.[Hash] = @StartHash AND CMIN.N >= CTE.N)