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

すべてのマーク日を 1 つの列に表示し、隣接する各マーク日を別の列に並べ替えたときの差を示すテーブルを作成する必要があります。これは私が書いた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 は、たとえば 2008 年 5 月 5 日 -> 2008 年 5 月 2 日の週末や長期の週末には参加しません。連続しない日付でテーブルを自己結合するにはどうすればよいですか? 助けてくれてありがとう!

4

2 に答える 2

1

これを行う唯一の方法は、行番号をサポートするSQLの日付順の選択でROW_NUMBER(およびROW_NUMBER + 1)を使用するか、日付順に入力する自動増分キーを使用して一時テーブルを作成することです。

非結合ソリューション(つまりループ)に頼らなければ、他の方法はありません。

于 2009-11-23T20:14:08.177 に答える
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 に答える