2016-12-08 2 views
0

У меня есть две таблицы:Последние Пожертвование клиентов и количество

  1. Customer который имеет Id столбец, представляющий идентификатор клиента.
  2. CustomerDonation, который содержит CustomerId (FK), Amount и DatePayed

Я хотел бы иметь все клиент вместе с их последним пожертвованием и суммой этого пожертвования.

Я получаю повторяющиеся значения по моему запросу, поэтому я не буду вставлять его здесь.

+1

Какая версия SQL Server? Вы должны *** еще *** вставить свой запрос здесь. Это может потребоваться только небольшим изменениям, и мы можем лучше объяснить эту проблему. Или он может даже указать какую-то полезную информацию, о которой не упоминалось иначе. Если у вас есть «почти рабочий» код, вы должны * всегда включать его. – MatBailie

ответ

1
WITH 
    SortedDonation AS 
(
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY DatePayed DESC) AS SeqID, 
     * 
    FROM 
     CustomerDonation 
) 
SELECT 
    * 
FROM 
    Customer 
LEFT JOIN 
    SortedDonation 
     ON SortedDonation.CustomerId = Customer.Id 
     AND SortedDonation.SeqId  = 1 

Если же клиент может сделать несколько пожертвований с той же DatePayed, то это будет произвольно выбрать только один из них.

Если вы добавите дополнительные поля в ORDER BY, вы можете детерминистически выбрать, какой из них вы хотите.

Или, если вы хотите, чтобы все из них используют DENSE_RANK() вместо ROW_NUMBER()

0

Использовать аналитическую функцию Row_Number().

Select * from (
    Select customerId,Amount,DatePayed, row_number() over (partition by CustomerId order by DatePayed desc) as rowN) 
    as tab where rowN = 1 
+0

Вы правы, быстро печатаете =) –

0

Для этого вам нужен только стол CustomerDonation. Вы можете присоединиться к таблице Customer, если хотите получить другую информацию о клиенте.

WITH cte AS (
SELECT 
    CustomerId 
    , MAX(DatePayed) AS LastDate 
FROM 
    CustomerDonation 
) 
SELECT 
    cd.CustomerId 
    , cd.Amount 
    , cd.DatePayed 
FROM 
    CustomerDonation cd 
    JOIN cte ON cd.CustomerId = cte.CustomerId 
     AND cd.DatePayed = cte.LastDate 
3

Вы также могли бы использовать с опцией СВЯЗЕЙ

Select Top 1 With Ties * 
    From YourTable 
    Order By Row_Number() over (Partition By CustomerId Order By DatePayed Desc) 
+0

Очень красивый, более короткий код и дополнительные поля случайно создаются :) – MatBailie

+0

Я никогда не думал об этом. : D – DVT

+1

@MatBailie Что я могу сказать ... Я ленивый, ленивый человек –

Смежные вопросы