2013-01-03 77 views
1

有没有办法在SQL中进行以下投影?根据排序删除第二列不更改的行吗?SQL删除重复的排序

FROM   TO 
1 504  1 504 
2 508  2 508 
3 504  3 504 
4 504  7 508 
5 504  8 504 
6 504  9 508 
7 508  10 504 
8 504  15 508 
9 508  16 504 
10 504   
11 504   
12 504   
13 504   
14 504   
15 508   
16 504   
17 504   
18 504   
19 504 
+2

什么平台? SQL Server? MySQL的?这可以使用窗口功能。 – NYCdotNet

+0

也许类似于'SELECT id,value FROM table WHERE id IN(1,2,3,7,8,9,10,15,16);'? – Oldskool

+0

我们正在使用MSSQL – pufferfish

回答

1

要使用标准SQL执行此操作,可以使用相关子查询。这个想法是让以前的值只保留行与当前值是不同的:

select a.* 
from (select t.* 
      (select max(id) from t t2 where t2.id < t.id) as pevid 
     from t 
    ) a left outer join 
    t aprev 
    on a.previd = aprev.id 
where aprev.value <> a.value or aprev.value is null 

这真是lag()功能的实现,但没有窗口的功能。

你也可以写这个使用上/极限/ ROWNUM和子查询这样的顺序:

select a.* 
from (select t.* 
      (select top 1 id from t t2 where t2.id < t.id order by id desc) as pevid 
     from t 
    ) a left outer join 
    t aprev 
    on a.previd = aprev.id 
where aprev.value <> a.value or aprev.value is null 

这反过来又可以简化为删除最后一个加入:

select a.* 
from (select t.* 
      (select top 1 val from t t2 where t2.id < t.id order by id desc) as pevval 
     from t 
    ) 
where a.prevval <> a.value or a.prevval is null 
2

取决于哪个RDBMS使用的是您可以使用LAG和LEAD分析函数来看看一首/下一行。

SELECT 
    a.* 
FROM (
    SELECT 
    id 
    , value 
    , LAG(value) OVER (ORDER BY id) previous_value 
    FROM some_table 
) a 
WHERE a.previous_value IS NULL OR a.value != a.previous_value 

在这里,内联视图将您的数据拉出,包括具有前一行值(当按ID排序时)的列。外部查询中的WHERE子句排除值与前一个值相同的行(并确保包含明显具有NULL previous_value的第一行)。

+0

我收到以下消息。消息11305,级别15,状态10,行7 并行数据仓库(PDW)功能未启用。 – pufferfish