没有嵌套查询的 Excel 的近似 VLOOKUP(第一个相关值)的 SQL 等效项
Posted
技术标签:
【中文标题】没有嵌套查询的 Excel 的近似 VLOOKUP(第一个相关值)的 SQL 等效项【英文标题】:SQL equivalent of Excel's approximate VLOOKUP (first relevant value) without nested query 【发布时间】:2014-04-29 14:10:51 【问题描述】:我正在尝试找到一种有效的方法来从现有表中选择第一个相关值,就像 Excel 的 VLOOKUP( , , , TRUE)
函数那样。这是我所拥有的,但如果@tableWithData
与@requiredDates
相比非常大,则此代码可能非常低效。我觉得我错过了什么。有没有更好的写法:
DECLARE @requiredDates TABLE
(requiredDate datetime)
INSERT INTO @requiredDates VALUES ('2014-01-01');
INSERT INTO @requiredDates VALUES ('2014-01-15');
INSERT INTO @requiredDates VALUES ('2014-02-01');
INSERT INTO @requiredDates VALUES ('2014-02-15');
DECLARE @tableWithData TABLE
(respectiveDate datetime,
associatedValue int
)
INSERT INTO @tableWithData VALUES ('2014-01-01', 1);
INSERT INTO @tableWithData VALUES ('2014-02-01', 2);
SELECT
lookupTable.requiredDate,
dataTable.associatedValue
FROM @tableWithData as dataTable RIGHT JOIN
(
/*Create table which maps the requiredDates -> maxDate highest available date */
SELECT
dates.requiredDate,
MAX(data.respectiveDate) as maxDate/*,
data.associatedValue*/
FROM @requiredDates as dates JOIN @tableWithData as data
ON dates.requiredDate >= data.respectiveDate
GROUP BY dates.requiredDate
) as lookupTable
on lookupTable.maxDate = dataTable.respectiveDate
注意:我使用的是 MS Server 2005,但如果有更通用的 SQL 实现,我也很感激。
【问题讨论】:
【参考方案1】:在 Excel 中,值为“TRUE”的vlookup()
会找到近似匹配项。我发现您的查询有点难以理解,但以下将获得小于或等于 respectiveDate
字段的最大值:
SELECT dt.associatedValue,
(SELECT TOP 1 rd.requiredDate
FROM dates.requiredDate rd
WHERE rd.requiredDate <= dt.respectiveDate
ORDER BY rd.requiredDate DESC
) as RequiredDate
FROM @tableWithData dt;
这种查询结构适用于所有数据库,但需要注意的是TOP 1
可能需要替换为其他内容(limit
子句、fetch first 1 rows only
子句或其他内容)。当然,临时表不会。
在 SQL Server 中,您也可以使用APPLY
来表达这一点。
【讨论】:
【参考方案2】:我一直在寻找解决方案,然后意识到对于我拥有的数据类型有一个非常简单的答案,虽然它与您的问题不完全匹配,但您可能会发现它很有用。想象一下,您尝试运行的查询是在给定日期谁是在位君主,并且您有一个君主统治表。在 excel 中,您可以对在位开始或结束日期的排序表进行 vlookup 搜索,但在 SQL 中,为统治开始和统治结束设置单独的列要容易得多,然后查询就像
SELECT * FROM 'monarchs' WHERE 开始 > 日期和结束
正如我所说,这是一个如此简单的查询,在某些情况下,可能值得看看数据是否可以重新配置以允许它。
【讨论】:
以上是关于没有嵌套查询的 Excel 的近似 VLOOKUP(第一个相关值)的 SQL 等效项的主要内容,如果未能解决你的问题,请参考以下文章