2014-11-13 2 views
2

나는 몇 년 동안 고객 데이터를 보유한 Tickets 테이블을 보유하고 있습니다. x 번 방문한 고객이 첫 방문시 쿠폰을 사용했는지 여부를 확인하려고합니다. 나는 내가 찾고있는 그룹을 탈출 할 수 있도록 이것을 사용하고있다 (아래의 SQL). 내가이 그룹에 대해 정말로 알고 싶은 것은 그들 중 얼마나 많은 사람들이 첫 번째 방문 (가장 빠른 SaleDate)에 쿠폰을 사용했는지입니다. 난 그냥 수를 필요로하고 CustomerID를 참조 할 필요가 없습니다 최종 결과 고객 기록의 첫 번째 레코드에있는 셀에 값이 들어 있는지 여부를 어떻게 결정합니까?

;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 

는 SaleDate는 등, 난 그냥 TotalCoupons 셀과에 값을 갖는 (의사) 선택 카운트 (CustomerID를)가 필요합니다 해당 CustomerID에 대한 가장 오래된 레코드입니다.

RowID를 추가하고 Where RowID = 1을 사용해야한다고 생각하지만 어떻게했는지 잘 모르겠습니다.

답변

3

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 당신이 찾고있는 정확하게 경우 다음은 플래그와 함께 그룹의 고객을 얻는다 그러나 충분히 가까워 야합니다.