Pergunta

Eu tenho uma mesa que se parece com o seguinte:

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

Preciso criar uma tabela que tenha todas as datas da marca em uma coluna e a diferença entre cada data de marca adjacente quando classificada em outra coluna. Este é o SQL que escrevi:

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));

No entanto, este SQL não se juntará ao fim de semana 5/5/2008 -> 5/2/2008, por exemplo ou em longos fins de semana. Como eu iria fazer a mesa se juntar a datas não contíguas? Obrigado por toda a ajuda!

Foi útil?

Solução

A única maneira de fazer isso é usar row_number (e row_number+1) em uma seleção ordenada por data para um SQL que suporta números de linha ou para criar uma tabela temporária com uma chave de incremento automático que você preencha em ordem de data.

Não há outra maneira sem recorrer a uma solução não-JOIN (que é um loop.)

Outras dicas

Você pode tentar usar row_number ao selecionar e entrar nesse pedido até a data.

EDITAR. Feito com junções.

O que você pode fazer é se juntar à tabela para si mesmo, em datas maiores que essa linha, e depois agrupar e selecionar o min.

Algo assim

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

Eu sei que esse é o código do SQL Server, mas pode ser facilmente alterado para o MS Access.

Isso deve devolver o seguinte:

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top