【发布时间】: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/2015NULL 而最新的应该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