说这是我的记录
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,所以我想省略此计数。
那么,查询可以是什么?谢谢 。
答案 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(*)更改为更有意义的内容。