【问题标题】:Joining two tables on the nearest single date在最近的单个日期连接两个表
【发布时间】:2015-08-28 01:21:55
【问题描述】:

我希望有人可以帮助我解决这个问题。我有两张表需要在最近的日期(最近的日期之前)加入。我通过一些搜索找到了一种使用 DATEDIFF 和 Row_Number 函数来执行此操作的方法,但输出并不是我想要的。这是我想要做的:

CREATE TABLE #OPS ([Date] Date, [Runtime] FLOAT, [INTERVAL] INT)
INSERT INTO #OPS Values
( '2015-02-09',29540.3,12),
('2015-02-16',29661.7, 10),
('2015-03-02',29993.7,10),
('2015-03-09',30161.7,12),
('2015-03-16',30333.4,12),
('2015-03-23',30337.9,5),
('2015-03-30',30506.9,12),
('2015-04-06',30628.1,6),
('2015-04-13',30795,4),
('2015-04-20',30961.2,6)

SELECT * FROM #OPS

CREATE TABLE #APPS ([Date] DATE, [Value] INT)
 INSERT INTO #APPS Values
 ('2015-03-05', 1000),('2015-03-27', 1040), ('2015-04-17', 1070)



 ;WITH Nearest_date AS
(
    SELECT
        t1.*,  t2.Date as date2, t2.Value,
        ROW_NUMBER() OVER
        (
            PARTITION BY t1.[Date]
            ORDER BY t2.[Date] DESC
        ) AS RowNum
    FROM #OPS t1
   LEFT JOIN #APPS t2
        ON t2.[Date] <= t1.[Date]
)
SELECT *
FROM Nearest_date
WHERE RowNum = 1
ORDER BY Date ASC

--This is what I get

Date    Runtime INTERVAL    date2   Value
2/9/2015    29540.3 12  NULL    NULL
2/16/2015   29661.7 10  NULL    NULL
3/2/2015    29993.7 10  NULL    NULL
3/9/2015    30161.7 12  3/5/2015    1000
3/16/2015   30333.4 12  3/5/2015    1000
3/23/2015   30337.9 5   3/5/2015    1000
3/30/2015   30506.9 12  3/27/2015   1040
4/6/2015    30628.1 6   3/27/2015   1040
4/13/2015   30795   4   3/27/2015   1040
4/20/2015   30961.2 6   4/17/2015   1070


-- This is what I want

Date    Runtime INTERVAL    date2   Value
2/9/2015    29540.3 12  NULL    NULL
2/16/2015   29661.7 10  NULL    NULL
3/2/2015    29993.7 10  NULL    NULL
3/9/2015    30161.7 12  3/5/2015    1000
3/16/2015   30333.4 12  NULL    NULL
3/23/2015   30337.9 5   NULL    NULL
3/30/2015   30506.9 12  3/27/2015   1040
4/6/2015    30628.1 6   NULL    NULL
4/13/2015   30795   4   NULL    NULL
4/20/2015   30961.2 6   4/17/2015   1070

您可以看到我想选择与第二个表中的所有日期进行比较的最接近的日期。我创建的查询为多个值显示了相同的日期——当这些日期中只有一个确实是最接近的时。任何帮助都将一如既往地受到高度赞赏。 -- 运行 MSSQL 2014

【问题讨论】:

  • 为什么3/16/2015 NULL 而最新的应该3/5/2015
  • 嗯 - 我正在寻找最近的“之前”日期。因此,如果事件发生在 [Date],我希望最近的 [Date2] 不大于 [Date]。因此 [Date2] - 3/5/2015 小于 [Date] - 3/9/2015。 [Date2] 3/5/2015 更接近 [Date] 3/2/2015(3 天后),但在这种情况下 [Date2] > [Date]。所以下一个值是 [Date] 2015 年 3 月 9 日,也就是 4 天后。 [日期] 2015 年 3 月 16 日是 7 天后(及之前)。我是不是一头雾水?

标签: sql sql-server tsql


【解决方案1】:

使用OUTER APPLYLEFT JOIN

SQL Fiddle

SELECT
    o.*,
    Date2 = t.Date,
    t.Value
FROM #OPS o
LEFT JOIN(
    SELECT
        a.*, Date2 = x.Date
    FROM #APPS a
    OUTER APPLY(
        SELECT TOP 1 *
        FROM #OPS
        WHERE
            [Date] <= a.Date
        ORDER BY [Date] DESC
    )x
)t
    ON t.Date2 = o.Date

【讨论】:

  • 快照。我写了一个几乎相同的解决方案,然后注意到你的答案。这是正确的答案。
  • @PaulSpain 如果不完全相同,请发布。 OP 将受益于拥有不同的选择。 =)
  • @FelixPamittan - 谢谢,这正是我想要的。我什至没有想过像这样使用外连接和左连接。非常感激。 PaulSpain - 也感谢您的努力
猜你喜欢
  • 1970-01-01
  • 2021-05-31
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 2015-06-29
相关资源
最近更新 更多