典型的场景/应用是使用以下数据/表结构进行搜索:
StartDate TheVersion
day1 ver1
day2 ver2
即,每个 new 版本号都记录在一个带有开始日期的表中。
因此,对于给定日期,如果它在day1
和day2
之间,并且day1
和day2
是表格中最相邻的记录,那么{{1应该返回。
问题在于我无法使用SQL BETWEEN子句,因为ver1
和day1
实际上来自不同的行。
怎么做?我想到了几种不同的方式,但没有一种方法不凌乱。通用SQL或T-SQL赞赏。我在SQL Server 2008R2 BTW上。谢谢。
答案 0 :(得分:3)
使用SQL Server 2012,您可以访问行的下一个(或上一个)值,如下所示:
WITH cteWithNext AS (
SELECT *, LEAD(StartDate) OVER (ORDER BY StartDate) EndDate
FROM YourTable
)
SELECT n.*
FROM cteWithNext n
WHERE dt >= n.StartDate AND dt < n.EndDate
对于较旧的SQL Server版本,您可以自行加入虚拟索引,如下所示:
WITH cteNumbered AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY StartDate) num
FROM YourTable
)
SELECT n1.*
FROM cteNumbered n1
JOIN cteNumbered n2 ON n1.num+1=n2.num
WHERE dt >= n1.StartDate AND dt < n2.StartDate
使用这些方法,您可以使用普通的比较运算符(如果语义符合您的需要,甚至可以使用BETWEEN
。)
答案 1 :(得分:2)
如果我理解正确,您希望获得在Given_Date时生效的版本。这是一个嵌套查询,首先在Given_Date之前或之前获取最大StartDate,然后返回附加到该日期的版本:
SELECT
Version_Table.StartDate,
Version_Table.TheVersion
FROM
Version_Table
INNER JOIN
(SELECT
Max(StartDate)
FROM
Version_Table
WHERE
StartDate <= Given_Date) maxdate on maxdate.startdate = version_table.startdate