我正在访问2010年我有一个表格,其格式如下:
ID BOORP BEGIN_DIEPTE EIND_DIEPTE TEXTUUR1
1 148000 0 10 ZK
2 148000 20 60 ZK
3 148000 60 80 MK
4 148000 80 110 MK
5 148000 110 130 ZK
6 148000 130 160 -
7 148000 160 220 ZZL
8 148000 220 250 -
9 148000 250 300 MK
10 148001 0 20 ZK
11 148001 20 40 -
12 148001 40 210 ZZL
13 148001 210 310 ZZL
我想要的是在以下条件下连接具有相同纹理的某些行:
1)行必须具有相同的BOORP才能合并
2)只能合并连续的行
结果应如下所示:
ID BOORP BEGIN_DIEPTE EIND_DIEPTE TEXTUUR1
1 148000 0 60 ZK
3 148000 60 110 MK
5 148000 110 130 ZK
6 148000 130 160 -
7 148000 160 220 ZZL
8 148000 220 250 -
9 148000 250 300 MK
10 148001 0 20 MK
11 148001 20 40 -
12 148001 40 310 ZZL
特别是我遇到问题的第二个条件。
有什么建议吗?
答案 0 :(得分:0)
作为纯SQL解决方案,这是一项非常复杂的任务。 如果要在一个查询中执行此操作,可以使用以下解决方案(在示例数据上测试):
SELECT e.ID, e.BOORP, e.BEGIN_DIEPTE, e.EINDDIEPTE As EIND_DIEPTE, e.TEXTUUR1
FROM
(
SELECT a.ID, a.BOORP, a.BEGIN_DIEPTE, IIF(b.ID Is Null, a.EIND_DIEPTE, b.EIND_DIEPTE) AS EINDDIEPTE, a.TEXTUUR1, b.ID As IDJoined
FROM TestTable a
LEFT JOIN
(
SELECT c.*, (SELECT Max(d.ID) FROM TestTable d WHERE d.ID < c.ID) As PreviousID
FROM TestTable c
) As b
ON b.PreviousID = a.ID AND b.BOORP = a.BOORP AND a.TEXTUUR1 = b.TEXTUUR1
) AS e
WHERE e.ID NOT IN (
SELECT b.ID
FROM TestTable a
INNER JOIN
(
SELECT c.*, (SELECT Max(d.ID) FROM TestTable d WHERE d.ID < c.ID) As PreviousID
FROM TestTable c
) As b
ON b.PreviousID = a.ID AND b.BOORP = a.BOORP AND a.TEXTUUR1 = b.TEXTUUR1
)
这是很多子查询,而且有点太多无法深入解释。简单地说,最内部的子查询(查询b
)LEFT JOIN
在等于BOORP
和TEXTUUR1
上,其中ID是先前的ID,然后是外部子查询(查询{ {1}})获取结果,并删除已与另一个条目连接的所有条目。
请注意,这会将2个条目连接在一起,而不是更多。如果要将两个以上的条目连接在一起,则可以对此结果运行类似的查询。