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