2013-10-21 62 views
0

我有一张包含数百万笔交易的表格。我需要找到最高的付费电流金额。 “当前”定义为在上次取消的交易后发生。该表格如下:在取消交易后查找最高交易金额

Id (guid) ServiceId CreatedDate    AmountPaid InsurerId IsCanceled 
76E9A3... 19   2013-08-30 12:34:01.580 56.00   96   0 
C3F325... 19   2013-08-30 12:34:02.069 14.95   110   0 
96E9A3... 19   2013-08-30 12:32:01.540 109.00  95   1 
C3BC25... 19   2013-08-30 12:32:02.007 15.95   108   1 
85E9A3... 19   2013-08-30 12:30:01.701 101.00  95   0 
A3F325... 19   2013-08-30 12:30:02.069 13.95   108   0 

正如您所看到的,对于同一个serviceID,我有多个事务。我需要在这里获取的是56美元的交易,因为对于同一个ServiceID,最近取消的交易是之后的最高的ServiceId

如果我做的:

ORDER BY CreatedDate DESC, AmountPaid DESC 

的第一排将是$ 14.95的交易...

如果我做的:

ORDER BY AmountPaid DESC, CreatedDate DESC 

的第一排将是101 $交易

更多信息:

服务交易取消后,任何交易都将失效。唯一有效的交易是在取消的交易之后创建的交易。

+3

那么,为什么不应该它是101 $的交易呢?你如何定义近期足够的? –

+0

56是高于109还是101? –

+0

我添加了一些额外的信息。 – Baral

回答

5
;WITH m AS 
(
    SELECT ServiceID, m = MAX(CreatedDate) 
    FROM dbo.whatever 
    WHERE IsCanceled = 1 GROUP BY ServiceID 
), 
n AS 
(
    SELECT w.*, 
    rn = ROW_NUMBER() OVER (PARTITION BY w.ServiceID ORDER BY w.AmountPaid DESC) 
    FROM dbo.whatever AS w 
    LEFT OUTER JOIN m ON w.ServiceID = m.ServiceID 
    WHERE w.CreatedDate > COALESCE(m.m, '19000101') 
) 
SELECT * FROM n WHERE rn = 1; 
+0

我使用这段代码,它工作得很好! – Baral

1

您可以使用ROW_NUMBERCTE

WITH CTE AS 
(
    SELECT t1.Id, t1.ServiceId, t1.CreatedDate, t1.AmountPaid, t1.InsurerId, t1.IsCanceled, 
     RN = ROW_NUMBER() OVER (PARTITION BY t1.ServiceId 
           ORDER BY t1.AmountPaid DESC, t1.CreatedDate DESC) 
    FROM dbo.Transactions t1 
    WHERE t1.iscanceled = 0 
    AND (NOT EXISTS(SELECT 1 FROM dbo.transactions t2 
        WHERE t1.serviceid = t2.serviceid 
        AND t2.iscanceled = 1) 
    OR (t1.createddate > (
        SELECT Max(createddate) 
        FROM dbo.transactions t2 
        WHERE t1.serviceid = t2.serviceid 
        AND t2.iscanceled = 1))) 
) 
SELECT Id, ServiceId, CreatedDate, AmountPaid, InsurerId, IsCanceled 
FROM CTE 
WHERE RN = 1 

Demo

+0

这将返回14.95美元的交易(原因不明)不是理想的交易。 –

+0

@AaronBertrand:但OP只对'IsCanceled = 0'的行感兴趣。根据期望的结果,我刚才看到了OP提到的要求,而不是实际的数据。 –

+0

@MartinSmith:我更喜欢回答一个要求,而不是错误的样本数据或不正确的结果。 –