2016-12-08 112 views
0

我有兩個表:最新客戶捐贈,金額

  1. Customer其中具有代表客戶ID的Id列。
  2. CustomerDonation包含CustomerId(FK),AmountDatePayed

我想擁有所有的客戶連同其最新的捐款和捐款金額。

我在我的查詢中收到重複值,因此我不會將其粘貼到此處。

+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

你也可以使用WITH TIES選項

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我能說什麼...我是一個懶惰的懶惰的男人 –