我有一张看起来像这样的表:
Code Mark Date Notional
Beta 5/1/2008 $1,102,451.00
Beta 5/2/2008 $1,102,451.00
Beta 5/5/2008 $1,102,451.00
Beta 5/6/2008 $1,102,451.00
我需要创建一个表,其中包含一列中的所有标记日期,以及在另一列中排序时每个相邻标记日期之间的差异。这是我写的SQL:
SELECT
Current.[Mark Date],
Prev.[Mark Date],
(DATEDIFF("d", Prev.[Mark Date], Current.[Mark Date])/365)
FROM Notional as Prev, Notional as Current
WHERE (Prev.[Mark Date] = (Current.[Mark Date]-1));
但是,这个SQL将不会在周末加入5/5/2008 - >例如,在2008年5月2日或长周末。我如何让桌子在非连续日期自我加入?谢谢你的帮助!
答案 0 :(得分:1)
按日期选择并加入该订单时,您可以尝试使用ROW_NUMBER。
EDIT。完成加入。
您可以做的是在比该行更大的日期将表连接到自身,然后分组并选择最小值。
像这样的东西
DECLARE @Table TABLE(
DateVal DATETIME
)
INSERT INTO @Table SELECT '01 May 2009'
INSERT INTO @Table SELECT '02 May 2009'
INSERT INTO @Table SELECT '05 May 2009'
INSERT INTO @Table SELECT '06 May 2009'
SELECT t.DateVal,
MIN(tNext.DateVal) NextDate
FROM @Table t LEFT JOIN
@Table tNext ON t.DateVal < tNext.DateVal
GROUP BY t.DateVal
我知道这是Sql Server代码,但可以很容易地更改为MS Access。
这应该返回以下内容:
StartDate EndDate
2009-05-01 00:00:00.000 2009-05-02 00:00:00.000
2009-05-02 00:00:00.000 2009-05-05 00:00:00.000
2009-05-05 00:00:00.000 2009-05-06 00:00:00.000
2009-05-06 00:00:00.000 NULL
答案 1 :(得分:1)
执行此操作的唯一方法是对支持行号的SQL按日期排序选择使用ROW_NUMBER(和ROW_NUMBER + 1),或者使用按日期顺序填充的自动增量键创建临时表。
如果不采用非连接解决方案(即循环),没有其他办法。