2015-06-05 3 views
4

Я пытался решить эту проблему сейчас в течение нескольких дней. У меня есть таблица с именем 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 

Что я пытаюсь сделать, это выбрать ACCOUNTNUMBER с последней указанной даты. Клиент может также иметь разные номера счетов в разных банках, поэтому его также следует группировать BankID и Customer.

Я пришел далеко:

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 столбца и дату мне удалось сделать это с более 2 подзапросы (запрос занимает много времени, но оно работает).

Но теперь у меня есть проблема, что в столбце Customer (или Date) есть значения NULL. Теперь номер учетной записи этих «NULL» клиентов по-прежнему должен отображаться, если это последняя дата. Я также попытался сделать то же самое, присоединившись к таблице сам по себе, и это не сработало.

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» имеют только NULL значения в сумме, дате и AccType Столбцы, которая не является правильным.

Выход должен быть чем-то вроде этого

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 

Спасибо заранее.

ответ

3

Просто используйте 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; 
+0

wow! это похоже на работу (с разделением по accnumb также), единственная проблема заключается в том, что я получаю дубликат AccountNumber для клиентов, имеющих также «NULL» в качестве имени клиента – Mance

+0

Мне пришлось разделить на bankId и Accnumb только :-) теперь отлично работает – Mance

0

Найти строки с последними датами, то есть возвращать строку, если нет другой строки с таким же ACCOUNTNUMBER, BankID и Клиентом, но более поздним сроком не существует:

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

Привет, спасибо, я просто попробовал это. Но я должен сгруппировать его с помощью AccountNumber, Bankid и Customer, после чего я больше не могу добавлять другие столбцы. (В результате не должно быть дубликатов AccountNumbers) – Mance

+0

Не можете ли вы показать нам желаемый результат? Может быть, я что-то пропустил, но мой запрос отражает то, как я читал ваше описание. – jarlh

+0

Я добавил результаты сейчас – Mance

0

Вы первый запрос тесно сотрудничает с тем, что, я считаю, вы ищете. Используя его в качестве базы, мы можем изменить для работы для вас:

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