2017-06-20 22 views
1

我有腳本,可以爲我提供所有帳戶和子帳戶的所有日常交易。他可以在圖像上看到他的迴歸。我想要的是將返回結果作爲每個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 
+0

查詢出了什麼問題? –

+0

我想要不同的輸出。不是所有日子的交易總和,而是交易完成後最近2天的交易總和。 –

+0

您的預期產出是多少? –

回答

0

我認爲你可以使用row_number並獲得2個記錄DS如下:

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 
+0

我不認爲你需要按日期分區,如果你只想要最後兩個事務。如果涉及一些時間,按日期劃分將給出每個日期的最後兩個日期。但看起來不是這種情況。 –

0

如果你想在SUM最後兩日,你需要一個編號分配給每一天假定一個天一個事務,

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

。然後,通過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] 
+0

我有一天有多筆交易。我使用Sum()來計算每個賬戶的日期總和 –

+0

我看到,交易有時間嗎?你想要每天的最後兩筆交易還是最後兩筆交易?因爲如果所有人都有相同的時間,我們不能確定哪一個是最後兩個。或者你想要最後兩天的所有交易的總和? –

+0

不,交易沒有時間。我想要在最後兩天交易時間的最後一筆交易,例如,我可能在5月25日和5月25日以及6月1日進行多筆交易。我想選擇五月二十五日和六月一日之間的交易總和。 –

0

我看你使用GROUP BY,所以如果你想要的結果來分組後進行排序,你應該如果使用HAVING你想否則你應該使用WHERE。以下是您可以在查詢中使用的WHERE子句的示例,以獲取最近兩天之間的結果。

WHERE (a1.[Date] BETWEEN GETDATE()AND GETDATE()-2) 
相關問題