2017-02-14 96 views
2

我在MSSQL以下數據中選擇最後一個值尊重順序:集團通過並及時

declare @TEMP table (Period int, Color varchar(20), Rate int) 
insert into @TEMP values(201601, 'Blue', 10) 
insert into @TEMP values(201602, 'Blue', 10) 
insert into @TEMP values(201603, 'Blue', 11) 
insert into @TEMP values(201604, 'Red', 11) 
insert into @TEMP values(201605, 'Red', 12) 
insert into @TEMP values(201606, 'Blue', 13) 
insert into @TEMP values(201607, 'Blue', 13) 
insert into @TEMP values(201608, 'Blue', 14) 
insert into @TEMP values(201609, 'Blue', 14) 
insert into @TEMP values(201610, 'Blue', 14) 
insert into @TEMP values(201611, 'Blue', 14) 
insert into @TEMP values(201612, 'Blue', 14) 

SELECT * FROM @TEMP 

我想通過顏色組,同時保持「時間順序」。所以前3個藍色記錄將被分組,獨立於最後的7個藍色記錄。最終,我想選擇組中的「最新」行。

輸出將是:

Period | Color | Rate 
    ------ | ----- | ---- 
    201603 | Blue | 11 
    201605 | Red  | 12 
    201612 | Blue | 14 
    ------ | ----- | ---- 
+0

'所以第3條藍色記錄將被分組獨立過去7藍records'.There的是沒有第一個和最後的SQL,直到你命令由..There必須是一些邏輯來確定groups.plus 1爲樣本數據 – TheGameiswar

+0

像總是第一3以便通過日期落入在一組中,其餘在其他組 – TheGameiswar

+0

感謝您的DDL,但除非需要請不要使用(MAX)數據類型。 – dean

回答

0

我希望你使用SQL Server的一些較新的版本,因爲窗口功能。

這裏的解決方案:

;with x as (
    select *, case when lag(color) over(order by period) = color then 0 else 1 end as g 
    from @temp 
), 
y as (
    select *, sum(g) over(order by period) gg 
    from x 
), 
z as (
    select *, row_number() over(partition by gg order by period desc) rn 
    from y 
) 
select period, color, rate from z where rn = 1 
+0

喜院長,是標準的16個工作,所以肯定能行。 輸出看起來完全是我想要的。我將通過這些步驟來弄清楚邏輯。謝謝! –

+0

至於步驟 - 是的,它看起來醜陋,但可悲的事實是,你不能撰寫窗口功能,從而多的CTE。 – dean