选择最新日期的帐号

Selecting Account Numbers with latest date

几天来我一直在努力解决这个问题。 我已经 table 使用以下简化结构和示例数据调用 Stat:

Customer    BankID  AccNumb Type                Date        Amount    AccType

Customer 1  Boa     5       Account Statement   2015-01-01  10000,00    Eur
Customer 1  CS      10      Account Statement   2015-04-04  22000,00    Eur
Customer 2  Sa      15      Account Statement   2015-03-13  3000,00     Eur
Customer 2  Sa      40      Account Statement   2015-04-24  1000,00     Eur
Customer 2  Sa      15      Sale Advice         2015-04-16  400,00      Eur
Customer 2  Sa      15      Account Statement   2015-12-24  50,00       Usd
Customer 2  Boa     20      Sale Advice         2015-05-15  6000,00     Eur
Customer 3  Cu      25      Account Statement   2015-11-27  81000,00    Eur
Customer 3  Cu      30      Sale Advice         2015-11-27  3000,00     Usd
Customer 3  Pop     30      Account Statement   2015-11-27  12000,00    Eur

我想做的是 Select AccountNumber 指定的最新日期。一个客户也可以在不同的银行有不同的帐号,所以它也应该按 BankID 和客户分组。

我已经走到这一步了:

SELECT AccNumb, Customer, BankID,
(SELECT TOP 1 Amount FROM Stat 
        WHERE AccNumb = y.AccNumb AND Customer = y.Customer AND 
              BankID = y.BankID AND Type = 'Account Statement' AND 
              Date = MAX(y.Date) GROUP BY Amount) Amount
FROM Stat y
    GROUP BY AccNumb, Customer, BankID
        ORDER BY Customer, AccNumb

它工作正常,问题是我还应该添加 AccType 和 Date 列 我设法用另外 2 个子选择来做到这一点(查询需要很长时间,但它有效)。

但现在我遇到了一个问题,即客户(或日期)列中也有 NULL 值。现在,如果是最新日期,这些 'NULL' 客户的帐号仍应显示。我也尝试通过自己加入 table 来做同样的事情,但没有成功。

SELECT x.AccNumber, x.Customer, x.BankID, x.Date, y.Amount, y.AccType
FROM Stat y RIGHT JOIN
    (SELECT AccNumber, Customer, BankID, MAX(Date) Date  FROM Stat 
        GROUP BY AccNumber, Customer, BankID) x 
 ON x.AccNumber = y.AccNumber AND 
    x.Customer = y.Customer AND 
    x.BankID = y.BankID AND 
    x.Date = y.Date
ORDER BY y.Customer, y.AccNumber        

但是现在 'NULL' 客户在 Amount、Date 和 AccType 列中只有 NULL 值,这是不正确的。

输出应该是这样的

AccNumb     Customer        BankID  Amount  Date        AccType

111111111   a               Boa     1234.40 31.06.2014  Eur
222222222   NULL            Boa     5678.40 31.04.2014  Eur
333333333   b               Boa     0.00    25.02.2014  Eur
444444444   NULL            Boa     9101.40 23.04.2015  Eur
555555555   NULL            Boa     1213.40 31.02.2014  Usd
A66666666   c               Sa      NULL    31.02.2014  Eur
777777777   c               Sa      1415.00 31.12.2014  Eur
888888888   c               Boa     1617.40 31.12.2014  Usd
999999999   f               Pop     5678.64 31.10.2014  Eur

提前致谢。

就用row_number(),如果我没理解错的话:

select s.*
from (select s.*,
             row_number() over (partition by customer, bankId order by date desc) as seqnum
      from stat s
     ) s
where seqnum = 1;

查找具有最新日期的行,即 return 如果没有其他行具有相同的 AccountNumber、BankID 和 Customer 但存在较晚的日期,则为一行:

select *
from stat s1
where not exists (select 1 from stat s2
                  where s1.AccountNumber = s2.AccountNumber
                    and s1.BankID = s2.BankID
                    and s1.Customer = s2.Customer
                    and s1.Date < s2.Date)

您的第一个查询与我相信您正在寻找的内容密切相关。以它为基础,我们可以改变为您工作:

SELECT 
    AccNumb, 
    Customer, 
    BankID,
    Amount,
    Date,
    AccType
FROM Stat y
WHERE Date = (SELECT MAX(z.DATE) 
              FROM Stat z 
              WHERE z.AccNumb = y.AccNumb 
                AND z.Customer = y.Customer 
                AND z.BankID = y.BankID AND Type = 'Account Statement')
ORDER BY Customer, AccNumb