在多行上加入 SELECT 仅在 SQL 服务器中的 TOP 行

JOIN on multilple rows to SELECT only TOP row in SQL Sever

我有一个 table,每个 ID/Date 只有 1 行,而另一个可以有重叠的 ID/Date。我需要以仅选择顶行的方式加入它们(实际上,重复 table 中的任何行都可以!)。只需两步(插入和更新)即可轻松完成此操作,但我正在寻找是否可以一步完成。

CREATE TABLE #Row1Each (ID VARCHAR(10), Date_ DATETIME, Value FLOAT) INSERT   INTO #Row1Each SELECT 'AAPL', '1/10/2015', 100 INSERT INTO #Row1Each SELECT 'MSFT', '1/10/2015', 20
CREATE TABLE #Table1 (ID VARCHAR(10), Date_ DATETIME, Qty FLOAT) INSERT INTO #Table1 SELECT 'AAPL', '1/10/2015', 55000
CREATE TABLE #Duplicates (ID VARCHAR(10), StartDate DATETIME, EndDate DATETIME, Quote FLOAT) INSERT INTO #Duplicates SELECT 'AAPL', '1/2/2015', '12/31/2016', 0.1 INSERT INTO #Duplicates SELECT 'AAPL', '1/4/2015', '10/05/2016', 0.11

/*
    AAPL    2015-01-10 00:00:00.000     100
    MSFT    2015-01-10 00:00:00.000     20

    AAPL    2015-01-10 00:00:00.000     55000

    AAPL    2015-01-02 00:00:00.000     2016-12-31 00:00:00.000     0.1
    AAPL    2015-01-04 00:00:00.000     2016-10-05 00:00:00.000     0.1
*/

SELECT  A.*
    ,   B.Qty
    ,   C.Quote  
FROM    #Row1Each A
        LEFT JOIN #Table1 B ON B.ID = A.ID 
                           AND B.Date_ = A.Date_
        LEFT JOIN #Duplicates C ON C.ID = A.ID 
                               AND A.Date_ BETWEEN C.StartDate AND C.EndDate

DROP TABLE #Row1Each DROP TABLE #Table1 DROP TABLE #Duplicates

/*  Desired output
    AAPL    2015-01-10 00:00:00.000     100     55000   0.1
    MSFT    2015-01-10 00:00:00.000     20      NULL    NULL
*/

您可以使用 APPLY 执行此操作。

SELECT
    r.Id,
    r.Date_,
    r.Value,
    t.Qty,
    d.Quote
FROM #Row1Each r
LEFT JOIN #Table1 t
    ON t.ID = r.ID
    AND t.Date_ = r.Date_
OUTER APPLY(
    SELECT TOP 1 *
    FROM #Duplicates d
    WHERE 
        d.ID = r.ID
        AND r.Date_ BETWEEN d.StartDate AND d.EndDate
    ORDER BY EndDate DESC -- Returns Top 1 Based on EndDate
)d