在SQL中没有top排序

时间:2015-06-12 15:01:25

标签: sql sql-server sql-server-2008

我有一个带有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。任何帮助表示赞赏。

1 个答案:

答案 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