2016-12-08 2 views
0

私は2つのテーブルがあります。最新のお客様の寄付と量

  1. Customer顧客IDを表すId列があります。 CustomerId(FK)が含まれてい
  2. CustomerDonationAmountDatePayed

私は一緒に彼らの最新寄付し、その寄付額ですべての顧客を持っていたいと思います。

私は質問に重複した値を受け取りますので、ここには貼り付けません。

+1

を使用することができますか?あなたは***まだ***あなたのクエリをここに貼り付けるべきです。わずかな変更が必要な場合がありますが、問題をより詳しく説明できます。あるいは、特に言及されていない有用な情報を示すかもしれません。あなたが「ほとんど働いている」コードを持っているなら、あなたは必ず*それを含めるべきです。 – 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にフィールドを追加すると、どのフィールドを確定するかを選択できます。

それとも、あなたがそれらのすべてがROW_NUMBER()

0

Use 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

の代わりにDENSE_RANK()を使用したい場合は、また、WITH TIESオプションSQL Serverのバージョン

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私は何を言うことができます...私は怠惰な、怠け者です –

関連する問題