【问题标题】:How do I determine whether a cell in the first record of a customers history contains a value?如何确定客户历史记录的第一条记录中的单元格是否包含值?
【发布时间】:2014-11-13 01:44:05
【问题描述】:

我有一个包含数年客户数据的门票表。我正在尝试确定访问过 x 次的客户在第一次访问时是否使用了优惠券。我有我正在使用的这个(下面的 SQL),以便我可以分解我正在寻找的组。关于这个群体,我真正想知道的是他们中有多少人在第一次访问时使用了优惠券(最早的 SaleDate)。

;WITH T AS
(
SELECT CustomerId, SaleDate, TotalCoupons,
       COUNT(*) OVER (PARTITION BY CustomerID) as Cnt
FROM    Store.dbo.Tickets
Where   (CreationDate between '2014-1-1' and '2014-11-12')
        and (IsDeleted = 0)
        And (TicketStatus = 'Complete')
)
SELECT CustomerID, SaleDate, TotalCoupons, Cnt                   
FROM T
WHERE Cnt = 10
order by CustomerId, SaleDate

作为最终结果,我只需要一个计数,不需要查看 CustomerID、SaleDate 等,我只需要一个(伪)Select Count(CustomerID),其中 TotalCoupons 单元格上有一个值,它是最早的该 CustomerID 的记录。

我想我必须添加一个 RowID 并使用 Where RowID = 1 但我不确定如何将它用于我所做的事情。

【问题讨论】:

    标签: sql sql-server-2008 common-table-expression


    【解决方案1】:

    可以使用row_number()判断第一次访问,然后使用条件聚合。以下获取带有标志的组中的客户:

    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;
    

    我不确定TotalCoupons IS NOT NULL 是否正是您正在寻找的,但它应该足够接近。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多