2013-04-29 5 views
0

특정 개체에 수행 된 모든 작업에 대한 데이터가 포함 된 테이블이 있습니다. 다음과 같이 아래의 표는 무언가를 나타납니다Dense 행 기능을 사용하여 카운트 일 수

ActionId ProductName ProductPart  ActionDate    ActionStatusId 
    1  Bike   abc123  3/24/2013 12:00:00 -4:00   7 
    2  Bike   abc123  3/25/2013 12:00:00 -4:00   3 
    3  Bike   abc123  3/25/2013 15:00:00 -4:00   1 
    4  Bike   abc123  3/26/2013 16:00:00 -4:00   3 
    5  Bike   abc123  3/26/2013 16:00:00 -4:00   3 
    6  Bike   abc123  4/26/2013 15:00:00 -4:00   3 
    7  Bicycle  def432  4/27/2013 12:00:00 -4:00   1 
    8  Bicycle  def432  4/26/2013 12:00:00 -4:00   4 
    9  Bicycle  def432  4/27/2013 12:00:00 -4:00   3 
    10  Bicycle  def432  4/28/2013 12:00:00 -4:00   1 

지금 내가 PRODUCTNAME, productpart을 얻을 필요가, laststatusid (가 3 인 경우에만 또는 1), [일 없음 이후 statusid = 3] 그래서 기본적으로

만약 마지막 actiondate에 따라 마지막 statusid가 3이나 1이 아니라면, 나는 row_number 함수를 사용하여 얻을 수있는 데이터가 필요하지 않습니다.

그러나 그 후 나는 마지막 actionstatusid 1.

하지만 난 그것을 달성에 문제가 = 만약 내가, 일을 계산 할 필요가 없습니다 = 3 statusid 경우 일 헤아 렸어요 계산해야하는 경우 때문에 마지막 statusid = 3 그렇다면 은 그 인스턴스가 아니라 그 인스턴스가 그 날짜까지 그 상태로 갔을 때의 수입니다.

그래서, PRODUCTNAME 자전거 위해 나는 결과 다음과 점점되어야한다 : 나는 ROW_NUMBER, DENSE_RANK 기능을 사용하고 있지만 그것을 달성 할 수 시도

ProductName ProductPart ActionStatusId [No. of Days Since Statusid = 3] 
    Bike  abc123   3    34 (i.e. getdate() - 3/26/2013) as it went to statusid = 3 since 3/26/2013 and not taking just last actiondate 
    Bicycle  dec432   1     - 

. 그것을 성취 할 수있는 방법이 있습니까? 또한 , 나는이 당신을 위해 도움이 될 2012 년

답변

1

가능한 SQL로하고 있어요 -

DECLARE @temp TABLE 
(
     ActionId INT 
     , ProductName VARCHAR(50) 
     , ProductPart VARCHAR(50) 
     , ActionDate DATETIME 
     , ActionStatusId TINYINT 
) 

INSERT INTO @temp (ActionId, ProductName, ProductPart, ActionDate, ActionStatusId) 
VALUES 
    (1, 'Bike', 'abc123', '20130324 12:00:00', 7), 
    (2, 'Bike', 'abc123', '20130325 12:00:00', 3), 
    (3, 'Bike', 'abc123', '20130325 15:00:00', 1), 
    (4, 'Bike', 'abc123', '20130326 16:00:00', 3), 
    (5, 'Bike', 'abc123', '20130326 16:00:00', 3), 
    (6, 'Bike', 'abc123', '20130426 15:00:00', 3), 
    (7, 'Bicycle', 'def432', '20130427 12:00:00', 1), 
    (8, 'Bicycle', 'def432', '20130426 12:00:00', 4), 
    (9, 'Bicycle', 'def432', '20130427 12:00:00', 3), 
    (10, 'Bicycle', 'def432', '20130428 12:00:00', 1) 

DECLARE @Date DATE = GETDATE() 

SELECT 
     ProductName 
    , ProductPart 
    , ActionStatusId 
    , CASE WHEN ActionStatusId = 3 
     THEN MAX(DATEDIFF(DAY, ActionDate, @Date)) 
     ELSE 0 
     END 
FROM @temp 
WHERE ActionStatusId IN (1, 3) 
GROUP BY 
     ProductName 
    , ProductPart 
    , ActionStatusId 

출력 :

ProductName ProductPart ActionStatusId Count 
------------- ------------ -------------- ----------- 
Bicycle  def432  1    0 
Bicycle  def432  3    2 
Bike   abc123  1    0 
Bike   abc123  3    35