2017-10-04 20 views
-1

最初の要求日から最初の完了日までの経過時間を計算する以下のクエリがあります。 しかし、以下の例では、2017-02-06で作成された要求日が2017-02-02(期限付き)です。SQLクエリアシスタントの編集/編集

私は、要求された日付を選択し、それが0 推論であるべきとき

だから今、それは1を返し FIRST 作成日から完了するまでの経過どのくらいの時間を計算するクエリを編集したいです最初に作成された日付が2017-02-03で、同じ日にリクエストされ完了したためです。2017-02-03

大変助けになりました!

     ,MIN(case 
           when SN_TYPE = 'Re-Activattion' 
           then Requested_Date 
           else null 
          end 

CREATE TABLE #temp 
(Identifier  VARCHAR(40) NOT NULL, 
Created_Date DATETIME NOT NULL, 
Requested_Date DATETIME NOT NULL, 
Completed_Date DATETIME NULL, 
SN_Type  VARCHAR(20) NOT NULL, 
SN_Status  VARCHAR(20) NOT NULL 
); 
INSERT INTO #temp 
VALUES 
('11111', 
'20170203', 
'20170203', 
'20170203', 
'Re-Activattion', 
'COMP' 
); 
INSERT INTO #temp 
VALUES 
('11111', 
'20170206', 
'20170202', 
NULL, 
'Re-Activattion', 
'N-CO' 
); 
SELECT * 
FROM #temp; 

-- calculate/identify Order start and Order End records 
WITH cte 
    AS (
    -- 1st Order start record i.e. earliest record in the table for a given "Identifier" 

    SELECT Identifier, 
      MIN(Created_Date) AS Created_Date, 
      CONVERT(VARCHAR(30), 'Created') AS RecordType, 
      1 AS OrderNumber 
    FROM #temp 
    GROUP BY Identifier 
    UNION ALL 
    -- All records with "COMP" status are treated as order completed events. Add 2 weeks to the completed date to create a "dummy" Order End Date 

    SELECT Identifier, 
      DATEADD(WEEK, 2, Created_Date) AS Created_Date, 
      'Completed' AS RecordType, 
      ROW_NUMBER() OVER(PARTITION BY Identifier ORDER BY Created_Date) AS OrderNumber 
    FROM #temp 
    WHERE SN_STATUS = 'COMP' 
    UNION ALL 
    -- Set the start period of the next order to be right after (3 ms) the previous Order End Date 

    SELECT Identifier, 
      DATEADD(ms, 3, DATEADD(WEEK, 2, Created_Date)) AS Created_Date, 
      'Created' AS RecordType, 
      ROW_NUMBER() OVER(PARTITION BY Identifier ORDER BY Created_Date) + 1 AS OrderNumber 
    FROM #temp 
    WHERE SN_STATUS = 'COMP'), 
-- Combine Start/End records into one record 
    OrderGroups 
    AS (
    SELECT Identifier, 
      OrderNumber, 
      MIN(Created_Date) AS OrderRangeStartDate, 
      MAX(Created_Date) AS OrderRangeEndDate 
    FROM cte 
    GROUP BY Identifier, 
       OrderNumber) 
    SELECT a.Identifier, 
      a.OrderNumber, 
      OrderRangeStartDate, 
      OrderRangeEndDate, 
      CASE 
       WHEN SUM(CASE 
          WHEN SN_STATUS = 'COMP' 
            AND SN_TYPE = 'Re-Activattion' 
          THEN 1 
          ELSE 0 
         END) > 0 
       THEN STR(DATEDIFF(day, MIN(CASE 
               WHEN SN_TYPE = 'Re-Activattion' 
               THEN Requested_Date 
               ELSE NULL 
              END), MIN(CASE 
                 WHEN(SN_TYPE = 'Re-Activattion' 
                   AND SN_STATUS = 'COMP') 
                 THEN Completed_Date 
                 ELSE NULL 
                END))) 
       WHEN SUM(CASE 
          WHEN SN_TYPE = 'Re-Activattion' 
          THEN 1 
          ELSE 0 
         END) > 0 
       THEN 'NOT COMP' 
       ELSE 'NO RE-ACT' 
      END AS RE_ACT_COMPLETION_TIME, 
      SUM(CASE 
        WHEN SN_STATUS = 'N-CO' 
        THEN 1 
        ELSE 0 
       END) AS [RE-AN NCO #] 
    FROM OrderGroups AS a 
      INNER JOIN #Temp AS b ON a.Identifier = b.Identifier 
            AND a.OrderRangeStartDate <= b.Created_Date 
            AND b.Created_Date <= a.OrderRangeEndDate 
    GROUP BY a.Identifier, 
       a.OrderNumber, 
       OrderRangeStartDate, 
       OrderRangeEndDate; 

答えて

0

は、私が最初に作成さDATEから

変更これを完了するまでの経過どのくらいの時間要求された日付を選択して、 を計算するクエリを編集したいですこれまで:

     ,MIN(case 
           when SN_TYPE = 'Re-Activattion' 
           then Created_Date 
           else null 
          end 
+0

しかし、私は作成された日付から数えたくありません。私は最初に作成された日付の要求された日付から数えたいと思う。 – Danielle

+0

はい、サブスクリプションの上位1 RequestedDate、ORDER BY CreatedDateを取得しています。 –

+0

あなたは何を意味するのかを実証できますか? – Danielle