获取表格中每个帐户的最后两个条目

时间:2017-06-20 14:18:18

标签: sql sql-server

我已经获得了脚本,可以为我提供所有帐户和子帐户的所有日常交易。他的回归你可以在图像上看到。我想要的是返回结果作为每个accountId和subaccountId的最后两笔交易。理想的回报是:

 AccountId| SubAccountId| AmountInDay | Date   
---------------------------------------------
 210      | 1           |  0.00       |2017-06-20 00:00:00.000
 210      | 1           |  0.00       |2017-06-05 00:00:00.000
 1234     | 1           |  0.00       |2017-06-20 00:00:00.000
 1234     | 1           |  0.00       |2017-06-05 00:00:00.000

这是我的脚本代码:

with CTE1 as
(
select top 2 AccountId, SubAccountId, [Date], sum(Amount_Amount) as Amount
from dbo.PayoutInstallment
group by accountId, SubAccountId, [Date]

)
, CTE2 as
(
select AccountId,SubAccountId, Amount_Amount, [Date],
       dense_rank() over (partition by AccountId order by [Date] desc) as rn
from dbo.PayoutInstallment
)
select a1.AccountId,a1.SubAccountId, Sum(a1.Amount_Amount) as AmountInDay, a1.[Date]
from CTE2 a1
left join CTE2 a2
on a1.AccountId = a2.AccountId and a1.[Date] > a2.[Date]
and a2.rn = a1.rn+1
group by a1.[Date], a1.AccountId, a1.SubAccountId
order by a1.[Date] desc

Image of return

修改  样本数据

 AccountId| SubAccountId| AmountInDay | Date   
---------------------------------------------
 210      | 1           |  0.00       |2017-03-15 00:00:00.000
 210      | 1           |  0.00       |2017-04-20 00:00:00.000
 210      | 1           |  100.00     |2017-05-17 00:00:00.000
 210      | 1           |  1.00       |2017-06-05 00:00:00.000
 210      | 1           |  1.00       |2017-06-05 00:00:00.000
 1234     | 1           |  0.00       |2017-06-05 00:00:00.000
 1234     | 1           |  0.00       |2017-06-05 00:00:00.000
 1234     | 1           |  1.00       |2017-06-10 00:00:00.000
 1234     | 1           |  1.00       |2017-04-10 00:00:00.000

4 个答案:

答案 0 :(得分:0)

我认为你可以使用row_number并获得2条记录,如下所示:

Select * from (
    Select AccountId, SubAccountId, [Date], sum(Amount_Amount) over (partition by accountid, SubAccountId, [Date])
        ,RowN = Row_number() over (partition by accountid, SubAccountId, [Date] order by [date] desc)
    from dbo.PayoutInstallment
) a where a.RowN <= 2

答案 1 :(得分:0)

假设一天一次交易,

;WITH cte AS(SELECT *
                 , ROW_NUMBER() OVER (PARTITION BY AccountId, SubAccountId ORDER BY [Date] DESC) AS Rownum
              FROM PayoutInstallment
 )
 SELECT *
      , SUM(AmountInDay) OVER (PARTITION BY AccountId, SubAccountId) AS SumLast2days
FROM cte
WHERE Rownum<=2

答案 2 :(得分:0)

如果您想要过去两天的SUM,则需要为每天分配一个号码。然后通过JOIN两个数据集提供与这些日期相关的所有数据,然后执行GROUP BY

WITH cte as (
     SELECT AccountId, SubAccountId, [Date],
            ROW_NUMBER() OVER (PARTITION BY AccountId, SubAccountId 
                               ORDER BY [Date] DESC) AS rn
     FROM dbo.PayoutInstallment
)
SELECT P.AccountId, 
       P.SubAccountId,
       P.[Date],
       SUM(ammount)
FROM dbo.PayoutInstallment P
JOIN cte C
  ON P.[Date] = C.[Date]
 AND P.AccountId  =  C.AccountId
 AND P.SubAccountId  = C.SubAccountId
WHERE rn <= 2  -- Just the last day of each account, subacount
GROUP BY P.AccountId, 
         P.SubAccountId,
         P.[Date]

答案 3 :(得分:0)

我发现您正在使用GROUP BY,因此如果您希望在分组后对结果进行排序,则应使用HAVING,否则您应该使用WHERE。以下是您可以在查询中使用WHERE子句的示例,以便仅获取过去两天之间的结果。

WHERE (a1.[Date] BETWEEN GETDATE()AND GETDATE()-2) 
相关问题