Вопрос

У меня есть таблица, которая выглядит примерно так:

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 или в длинные выходные.Как бы мне добиться того, чтобы таблица самостоятельно соединялась по несмежным датам?Спасибо за всю помощь!

Это было полезно?

Решение

Единственный способ сделать это - использовать ROW_NUMBER (и ROW_NUMBER+1) в выборке, упорядоченной по дате, для SQL, который поддерживает номера строк, или создать временную таблицу с ключом автоматического увеличения, которую вы заполняете в порядке дат.

Нет другого способа, не прибегая к решению без объединения (то есть циклу).)

Другие советы

Вы можете попробовать использовать 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top