2

我有一个看起来像这样的表:

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 -> 5/2/2008 或长周末加入。我将如何让表在非连续日期上自行加入?感谢所有的帮助!

4

2 回答 2

1

您可以在按日期选择并加入该订单时尝试使用 ROW_NUMBER。

编辑。完成连接。

您可以做的是在大于该行的日期上将表连接到自身,然后分组并选择最小值。

像这样的东西

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
于 2009-11-23T19:58:51.500 回答
1

这样做的唯一方法是对支持行号的 SQL 的按日期排序的选择使用 ROW_NUMBER(和 ROW_NUMBER+1),或者使用按日期顺序填充的自动增量键创建临时表。

如果不求助于非连接解决方​​案(即循环),就没有其他方法。

于 2009-11-23T20:14:08.177 回答