2017-11-25 126 views
1

我有一個場景,我試圖讓每個分區對應機會的所需的一切。一個記錄中的每個最小和最大日期的SQL Server窗口函數

我有下面的例子,我只想返回一列中Service_Appointment列中每個值的最小值和最大值,所以我可以將其作爲另一個數據集的一部分進行查詢。我需要它在一行這就是爲什麼我使用row_number函數來查詢where RN = 1

有很多行返回一個機會,我想要做的是所有的最小值和最大值爲每個約會類型使用Createdon

下面是示例數據:

CREATE TABLE #temptable 
(
    [ActivityId] int, 
    [OpportunityId] int, 
    [Appointment_Service] nvarchar(255), 
    [CreatedOn] datetime, 
    [Appt_Booked_Date] datetime, 
    [Appointment_State] nvarchar(255), 
    [Appointment_Status] nvarchar(255), 
    [RN] bigint, 
    [LASTEST_First_Appointment] datetime, 
    [LASTEST_Second_Appointment] datetime 
) 

INSERT INTO #temptable 
VALUES 
    (4176537, 105994, N'1st Appointment', N'2015-01-27T00:00:00', N'2015-01-27T00:00:00', N'Closed', N'Attended', 1, N'2015-01-27T00:00:00', N'2017-11-21T11:25:46'), 
    (4176536, 105994, N'2nd Appointment', N'2015-01-28T00:00:00', N'2015-01-28T00:00:00', N'Closed', N'Attended', 2, N'2015-01-28T00:00:00', N'2017-11-21T11:25:46'), 
    (19656494, 105994, N'Other Appointment', N'2017-03-31T15:33:26', N'2017-03-31T15:33:26', N'Scheduled', N'In Progress', 3, N'2017-11-21T11:25:46', N'2017-11-21T11:25:46'), 
    (9394803, 105994, N'Other Appointment', N'2017-04-28T06:38:56', N'2017-04-28T06:38:56', N'Scheduled', N'In Progress', 4, N'2017-11-21T11:25:46', N'2017-11-21T11:25:46'), 
    (3774963, 105994, N'Other Appointment', N'2017-04-28T17:20:06', N'2017-04-28T17:20:06', N'Scheduled', N'In Progress', 5, N'2017-11-21T11:25:46', N'2017-11-21T11:25:46') 

這是我的查詢

SELECT 
    ActivityId, OpportunityId, 
    Appointment_Service, CreatedOn, 
    Appt_Booked_Date, 
    Appointment_State, Appointment_Status, 
    ROW_NUMBER() OVER (PARTITION BY OpportunityId ORDER BY CreatedOn, ActivityId) AS RN, 
    LAST_VALUE(CreatedOn) OVER (PARTITION BY Appointment_Service ORDER BY CreatedOn, ActivityId ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS LASTEST_First_Appointment 
FROM  
    dbo.DIM_APPOINTMENT 

有3種不同的約會,所以我只是想首先第一個任命,最後1日任命(如果有的話),第一次約會和第二次約會,與其他約會一樣。當我有我需要的所有列時,我可以只查詢row_number字段來帶回RN = 1,這將帶來我需要的一切,至少這是計劃哈哈,提前謝謝

+4

請您提供樣品輸出嗎? – lucky

+0

您的表格沒有'service_appointment'列。 –

回答

0

我去了簡單的數據爲我的測試設置:

DECLARE @test TABLE 
     (
      Id  INT 
     ,category INT 
     ,x  INT 
    ); 

INSERT INTO @test 
    (
     Id 
     ,category 
     ,x 
    ) 
VALUES 
    (1, 1, 1) 
    ,(1, 1, 2) 
    ,(1, 1, 3) 
    ,(1, 1, 4) 
    ,(1, 2, 5) 
    ,(1, 2, 6) 
    ,(1, 2, 7) 
    ,(1, 2, 8); 

當我跑到你的代碼就好像你在哪裏上錯列(即或我只是沒有保持你的例子直在我的頭)劃分。在這個數據集類別代表預約類型。

然後,我們只需要得到我們的拳頭,最後的正確設置:

SELECT DISTINCT 
    t.Id 
    ,t.category 
    ,firstX = FIRST_VALUE(x) OVER (PARTITION BY Id, category ORDER BY x) 
    ,lastX = LAST_VALUE(x) OVER (PARTITION BY Id 
              ,category 
            ORDER BY x 
            RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 
           ) 
    FROM @test AS t; 

下面是結果:

Id category firstX lastX 
1 1   1  4 
1 2   5  8 

然後轉動的結果集:

WITH cte_last 
    AS (
      SELECT DISTINCT 
       t.Id 
       ,t.category 
       ,firstX = FIRST_VALUE(x) OVER (PARTITION BY Id, category ORDER BY x) 
       ,lastX = LAST_VALUE(x) OVER (PARTITION BY Id 
                 ,category 
               ORDER BY x 
               RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 
             ) 
      FROM @test AS t 
     ) 
SELECT l.Id 
     ,cat1First = SUM(CASE l.category WHEN 1 THEN l.firstX ELSE 0 END) 
     ,cat1Last = SUM(CASE l.category WHEN 1 THEN l.lastX ELSE 0 END) 
     ,cat2First = SUM(CASE l.category WHEN 2 THEN l.firstX ELSE 0 END) 
     ,cat2Last = SUM(CASE l.category WHEN 2 THEN l.lastX ELSE 0 END) 
    FROM cte_last AS l 
GROUP BY Id; 

你得到這個:

Id cat1First cat1Last cat2First cat2Last 
1 1   4   5   8 
相關問題