2012-02-27 15 views
1

が、これは例えばSQL、最新の関連レコードを取得

Favid MerchantId  CustomerId     Reason CreatedTime 
1  58 7A4BB789-DC5B-430C-8321-A168AFE0C589  2012-02-10 16:48:28.087 
2  58 7A4BB789-DC5B-430C-8321-A168AFE0C589 bbx 2012-02-11 21:00:00.903 
3  58 7A4BB789-DC5B-430C-8321-A168AFE0C589 bbx 2012-02-12 21:02:25.357 
4  58 7A4BB789-DC5B-430C-8321-A168AFE0C589 bbx 2012-02-13 21:04:48.123 
5  58 7A4BB789-DC5B-430C-8321-A168AFE0C589 bbx 2012-02-13 21:15:06.717 
6  58 7A4BB789-DC5B-430C-8321-A168AFE0C589 lol 2012-02-13 21:38:24.703 
7  58 7A4BB789-DC5B-430C-8321-A168AFE0C589 cf 2012-02-13 21:45:25.303 
8  59 7A4BB789-DC5B-430C-8321-A168AFE0C589 halo 2012-02-13 21:49:23.273 
9  58 7A4BB789-DC5B-430C-8321-A168AFE0C589 bya 2012-02-17 21:54:06.337 
10 59 CBDD557F-0DF2-4455-82FC-18C473A4044A good 2012-02-14 15:17:54.197 
11 59 CBDD557F-0DF2-4455-82FC-18C473A4044A lala 2012-02-16 15:36:39.240 
12 59 CBDD557F-0DF2-4455-82FC-18C473A4044A tatar 2012-02-13 15:40:56.907 
13 59 CBDD557F-0DF2-4455-82FC-18C473A4044A heh 2012-02-13 15:46:24.417 
14 58 CBDD557F-0DF2-4455-82FC-18C473A4044A lahaha 2012-02-24 15:50:48.450 

私の記録であると言う、私はここにトリッキーな部分があるMerchantId番号58にマッチした最新の個別得意先のためのカウントを取得したいのですが、特定のCustomerIdには後で一致するMerchantId 59が既にあるかもしれないので、このカウントを省略したいと思います。

したがって、クエリはどのようになりますか?ありがとう。

+0

SQLまたはLINQ文が必要ですか? –

+0

それで、前の例で期待される結果はどうでしょうか? –

+0

sqlまたはlinqは何でもできます。ターゲットmerchantIDが58の場合、結果は2のカウントになります。 レコードのFavid 9は、merchantIdが59で、ターゲットmerchantIdが58の場合、カウントは1であるとします。 – user777310

答えて

0

私はで始まるでしょう:だから、あなたはその顧客のための最も最近の行にMerchantIDなどのために58が表示される個別の得意先コードの値の数をしたい

select count(distinct customerID) from details d, customers c 
where d.merchant_id = 58 and 
(select count(*) from details d2 where c2.customerID = d2.customerid) = 0 
0

?以下のクエリでは、各顧客の最新の行が識別されます。これは、rank()以上の値(CreatedTime descによるCustomerID順のパーティション)が1であるためです。彼らは、内側のクエリ・パーティション(群)結果(1から始まる)はCreatedTimeによって、各パーティション内で順序付けはcustomerIdとrownumbersによってデータをMerchantID = 58

declare @target int = 58; 
with RankedPerCustomerID as (
    select 
    CustomerID, 
    MerchantID, 
    rank() over (
     partition by CustomerID 
     order by CreatedTime desc 
    ) as rk 
    from Fav 
) 
    select 
    count(*) as numCustomers 
    from RankedPerCustomerID 
    where rk = 1 and MerchantID = @target; 
0

を有する場合、このような行がカウントされます。サンプル・データについて

、この行は1行番号を与えられる(顧客以内7A4BB789-DC5B-430C-8321-A168AFE0C589

9  58 7A4BB789-DC5B-430C-8321-A168AFE0C589 bya 2012-02-17 21:54:06.337 

外部クエリは、その後のみ」に見えます最新のレコードを顧客ごと」と、各顧客に関連付けられている最後の商人は結果のために、58

select count(*) 
from 
(
select *, rn=row_number() over (partition by CustomerId order by CreatedTime desc) 
from Tbl 
) Innr 
where rn=1 
    and MerchantId = 58 

そしてCOUNTはもちろん、それだけで場所を選びます。 CustomerIdsなどの他の情報が必要な場合は、select式のCOUNT(*)をもっと意味のあるものに変更してください。