SQL删除重复排序

时间:2013-01-03 14:59:24

标签: sql sql-server

有没有办法在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 个答案:

答案 0 :(得分: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的第一行)。

答案 1 :(得分: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()函数的一个实现,但是没有窗口函数。

您也可以使用top / limit / 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