Sql 为什么交叉应用不能正常工作?

Sql 为什么交叉应用不能正常工作?,sql,sql-server,Sql,Sql Server,我创建了一个包含日期和资产价格的临时表。我想计算每日收益。当我使用LAG时,它工作得很好,但是当我使用crossapply时,就会出问题。谁能解释一下我的错误在哪里 CREATE TABLE #returns (Data Date, s Float); INSERT INTO #returns (Data, s) VALUES ('20120618', 142), ('20120619', 122), ('20120620', 145), ('20120621', 148), ('201206

我创建了一个包含日期和资产价格的临时表。我想计算每日收益。当我使用LAG时,它工作得很好,但是当我使用crossapply时,就会出问题。谁能解释一下我的错误在哪里

CREATE TABLE #returns (Data Date, s Float);

INSERT INTO #returns (Data, s) VALUES ('20120618', 142), ('20120619', 122), ('20120620', 145), ('20120621', 148), ('20120622', 111);

SELECT *
FROM #returns

SELECT Data, (s/LAG(s) OVER(ORDER BY Data) -1)
FROM #returns


SELECT tLater.Data, (tLater.s / tPrev2.s) - 1
FROM #returns as tLater
CROSS APPLY
   (
    SELECT TOP 1 tPrev.s
    FROM #returns as tPrev
    WHERE tPrev.Data < tlater.Data
    ORDER BY tPrev.Data
   ) as tPrev2

通常,当您使用时,您通常会将交叉应用更改为外部应用,并且外部应用中的语句应该是orderby desc

SELECT tLater.Data, (tLater.s / tPrev2.s) - 1
FROM #returns as tLater
OUTER APPLY
   (
    SELECT TOP 1 tPrev.s
    FROM #returns as tPrev
    WHERE tPrev.Data < tlater.Data
    ORDER BY tPrev.Data DESC
   ) as tPrev2

“出了点问题”。这是什么东西?你必须1使用外部应用而不是交叉应用来获得第一条记录,它没有以前的记录,2使用DESC的ORDER来获得以前的记录。
SELECT tLater.Data, (tLater.s / tPrev2.s) - 1
FROM #returns as tLater
OUTER APPLY
   (
    SELECT TOP 1 tPrev.s
    FROM #returns as tPrev
    WHERE tPrev.Data < tlater.Data
    ORDER BY tPrev.Data DESC
   ) as tPrev2