SQL相关,获取最新的相关记录

时间:2012-02-27 03:59:45

标签: sql linq

说这是我的记录

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

例如,我想获得与商家编号58相匹配的最新不同CustomerID的计数,但这里棘手的部分是特定的CustomerId可能已经有一个以后匹配的MerchantId 59,所以我想省略此计数。

那么,查询可以是什么?谢谢 。

3 个答案:

答案 0 :(得分:0)

我会从:

开始
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   

答案 1 :(得分:0)

那么您是否想要在该客户的最新行中显示为58的MerchantID的不同CustomerID值的数量?在下面的查询中,标识了每个客户的最新行,因为它的rank()值为1(按CreIDTime desc按CustomerID顺序划分)。如果这些行具有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;

答案 2 :(得分:0)

内部查询按customerId对数据进行分区(分组),并对每个分区中按CreatedTime排序的结果(从1开始)进行分类。

对于您的样本数据,此行的行号为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(*)更改为更有意义的内容。