Sql 如何确定客户历史记录的第一条记录中的单元格是否包含值?
我有一个Tickets表,可以保存数年的客户数据。我试图确定一位已经访问x次的客户是否在第一次访问时使用了优惠券。我有这个(下面的SQL),我正在使用,以便我可以打破我寻找的组。我真正想知道的是,他们中有多少人在第一次访问(最早的销售日期)时使用了优惠券 作为最终结果,我只需要一个计数,不需要查看CustomerID、SaleDate等,我只需要一个(伪)选择计数(CustomerID),其中TotalCouples单元格上有一个值,它是该CustomerID的最早记录Sql 如何确定客户历史记录的第一条记录中的单元格是否包含值?,sql,sql-server-2008,common-table-expression,Sql,Sql Server 2008,Common Table Expression,我有一个Tickets表,可以保存数年的客户数据。我试图确定一位已经访问x次的客户是否在第一次访问时使用了优惠券。我有这个(下面的SQL),我正在使用,以便我可以打破我寻找的组。我真正想知道的是,他们中有多少人在第一次访问(最早的销售日期)时使用了优惠券 作为最终结果,我只需要一个计数,不需要查看CustomerID、SaleDate等,我只需要一个(伪)选择计数(CustomerID),其中TotalCouples单元格上有一个值,它是该CustomerID的最早记录 我想我必须添加一个Row
我想我必须添加一个RowID并使用Where-RowID=1,但我不确定如何将其应用到我所做的工作中 您可以使用
行号()
确定首次就诊,然后使用条件聚合。以下内容获取具有该标志的组中的客户:
WITH T AS (
SELECT CustomerId, SaleDate, TotalCoupons,
COUNT(*) OVER (PARTITION BY CustomerID) as Cnt,
ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY SaleDate) as seqnum
FROM Store.dbo.Tickets
Where (CreationDate between '2014-01-01' and '2014-11-12') and
(IsDeleted = 0) and
(TicketStatus = 'Complete')
)
SELECT CustomerID, SaleDate, TotalCoupons, Cnt,
MAX(CASE WHEN seqnum = 1 and TotalCoupons IS NOT NULL) as HasCouponFirstVisit
FROM T
WHERE Cnt = 10;
您可以通过执行以下操作来计算它们的数量:
WITH T AS (
SELECT CustomerId, SaleDate, TotalCoupons,
COUNT(*) OVER (PARTITION BY CustomerID) as Cnt,
ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY SaleDate) as seqnum
FROM Store.dbo.Tickets
Where (CreationDate between '2014-01-01' and '2014-11-12') and
(IsDeleted = 0) and
(TicketStatus = 'Complete')
)
SELECT COUNT(CustomerID)
FROM T
WHERE Cnt = 10 AND seqnum = 1 AND TotalCoupons IS NOT NULL;
我不确定你要找的是不是totalcoups不为空
,但它应该足够接近
WITH T AS (
SELECT CustomerId, SaleDate, TotalCoupons,
COUNT(*) OVER (PARTITION BY CustomerID) as Cnt,
ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY SaleDate) as seqnum
FROM Store.dbo.Tickets
Where (CreationDate between '2014-01-01' and '2014-11-12') and
(IsDeleted = 0) and
(TicketStatus = 'Complete')
)
SELECT COUNT(CustomerID)
FROM T
WHERE Cnt = 10 AND seqnum = 1 AND TotalCoupons IS NOT NULL;