没有嵌套查询的 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 等效项的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL VBA 或 Function VLookup - 基于多个条件来查找值

Excel坐下,VLOOKUP基本操作

excel vlookup函数怎么查询一个值返回多个结果

excel

excel函数之VLOOKUP

excel 2010 vba。 sql查询列'like' vlookup