首页 > 解决方案 > 基于子分组合并重复行

问题描述

我有一个时间值表,其中在分组中存在重复值,但我想为每个分组删除除一个之外的所有值并保持顺序(不能只说不同的值)。

如果行的顺序是这样的

+------+-----+
| time | col |
+------+-----+
| 1    | A   |
| 2    | A   |
| 3    | A   |
| 4    | B   |
| 5    | B   |
| 6    | B   |
| 7    | C   |
| 8    | D   |
| 9    | E   |
| 10   | A   |
| 11   | A   |
| 12   | B   |
+------+-----+

那么结果应该是

+-----+
| col |
+-----+
| A   |
| B   |
| C   |
| D   |
| E   |
| A   |
| B   |
+-----+

有没有办法在没有光标的情况下做到这一点?我在非 SQL 中的做法是遍历列表并说当前索引是否与前一个索引匹配,然后弹出它。

标签: sqlsql-server

解决方案


SQL 表表示无序集。您要删除的行取决于排序,特别是相邻的相同值将被删除。

为了有一个排序,数据需要一个指定它的列。让我假设你有一个。

如果是这样,这很容易处理lag()

select col
from (select t.*, lag(col) over (order by orderingcol) as prev_col
      from t
     ) t
where prev_col <> col or prev_col is null;

推荐阅读