我有一个带有AcctNbr,Balance和Date列的测试表。该表包含以下数据
Acctnbr Balance LastUpdatedDt
123 100 May 08
456 200 May 08
222 300 May 07
333 400 May 07
123 50 May 06
222 120 May 05
678 70 May 04
我试图实现以下日常平衡
AcctNbr Balance LastUpdatedDt
123 100 May 08
456 200 May 08
222 300 May 08
333 400 May 08
123 50 May 08
678 70 May 08
123 50 May 07
456 0 May 07
222 300 May 07
333 400 May 07
123 50 May 07
678 70 May 07
123 50 May 06
456 0 May 06
222 120 May 06
333 0 May 06
123 50 May 06
678 70 May 06
123 0 May 05
456 0 May 05
222 120 May 05
333 0 May 05
123 0 May 05
678 70 May 05
123 0 May 04
456 0 May 04
222 0 May 04
333 0 May 04
123 0 May 04
678 70 May 04
这是我的查询
SELECT
A.Accountnbr,
dt AS CalendarDate,
A.Balance
FROM
dbo.GetDates('20150504',GETDATE())
cross APPLY
(
SELECT TOP 1 Accountnbr,Balance
FROM dbo.Test
WHERE LastUpdateDt <= dt
ORDER BY LastUpdateDt DESC
) A
当我在CROSS APPLY中使用TOP和Order BY时,这工作正常。但我希望所有账户都能获得余额。我不能在CROSS APPLY中使用TOP,因为Test表每天都会使用新帐户进行更新,但我需要Order By来从GetDates函数中的To和End日期获得正确的余额。我的问题是如何在上面的查询中使用Order by而不使用TOP。任何帮助表示赞赏。
答案 0 :(得分:1)
我会在帐号和日期上使用带行号和分区的cte(假设你想要最新的帐号和日期)。
如果需要,您可以将任何表连接到cte表。
with balance_cte as (
SELECT Accountnbr,
LastUpdatedDt,
Balance,
row_number() over (partition by Accountnbr. mydate order by LastUpdateDt DESC) as rn
FROM dbo.Test
)
select Accountnbr,
LastUpdatedDt,
Balance
from join balance_cte
where rn = 1