【发布时间】:2011-12-30 20:06:13
【问题描述】:
我有一个表,该表有一列可能在突发中具有相同的值。像这样:
+----+---------+
| id | Col1 |
+----+---------+
| 1 | 6050000 |
+----+---------+
| 2 | 6050000 |
+----+---------+
| 3 | 6050000 |
+----+---------+
| 4 | 6060000 |
+----+---------+
| 5 | 6060000 |
+----+---------+
| 6 | 6060000 |
+----+---------+
| 7 | 6060000 |
+----+---------+
| 8 | 6060000 |
+----+---------+
| 9 | 6050000 |
+----+---------+
| 10 | 6000000 |
+----+---------+
| 11 | 6000000 |
+----+---------+
现在我想修剪 Col1 的值重复的行,并且只选择第一次出现的行。
对于上表,结果应该是:
+----+---------+
| id | Col1 |
+----+---------+
| 1 | 6050000 |
+----+---------+
| 4 | 6060000 |
+----+---------+
| 9 | 6050000 |
+----+---------+
| 10 | 6000000 |
+----+---------+
如何在 SQL 中执行此操作?
请注意,只应删除突发行,并且可以在非突发行中重复值! id=1 & id=9 在样本结果。
编辑:
我用这个实现了它:
select id,col1 from data as d1
where not exists (
Select id from data as d2
where d2.id=d1.id-1 and d1.col1=d2.col1 order by id limit 1)
但这仅适用于 id 是连续的。由于 id 之间的间隙(已删除的),查询会中断。我该如何解决这个问题?
【问题讨论】:
-
id是否保证是连续的(没有间隙或重复)? -
所以你用的是SQlite和MS Access,不能用
row_number()这样的窗口函数,对吧? -
@ErwinBrandstetter:是的,我使用的是 SQlite 和 MS Access,当我搜索它们不支持 LAG 和 LEAD 时,我没有找到任何像 row_numbers 这样的窗口函数。
标签: sql sqlite ms-access duplicates