2017-02-14 121 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