(旁白:为什么一般人(拉胡尔是不是唯一的一个,由任何想象的延伸),从问题中省略了表的名称?)
这是很难做到的以关系的方式,因为它本质上依赖于(无序)集上的数据和关系代数作品的排序。我认为我们应该假定DocID列没有意义,并且不能用来帮助解决问题。
在此示例中,您有S003和S005并且缺少S004。我们如何判断有缺失的价值?据推测,因为存在一个比较操作,它告诉我们'小于','相等','大于',还因为有一个差异函数告诉我们S003和S005之间的差距是2.假设' >'和朋友做比较(在这里工作的字符串),并且你可以产生一个存储过程webid_diff(),它接受两个WebID值并返回差异。
然后,您可以编写一个查询,如:
SELECT a.webid, MIN(b.webid) AS min_next
FROM AnonymousTable AS a, AnonymousTable AS b
WHERE a.webid < b.webid
GROUP BY a.webid;
这使用表之间的非等值连接和自身查找每个项目的最低继任者WebID值。
以此为核心,我们可以过滤结果以仅选择那些WebID和Min_Next之间的差距超过一个的行。所以,我认为我们得到(1 尝试):
SELECT x.webid, y.min_next, webid_diff(x.webid, y.min_next) AS gap
FROM AnonymousTable AS x,
(SELECT a.webid, MIN(b.webid) AS min_next
FROM AnonymousTable AS a, AnonymousTable AS b
WHERE a.webid < b.webid
GROUP BY a.webid
) AS y
WHERE x.webid = y.webid
AND webid_diff(x.webid, y.min_next) > 1;
是联接在外部水平实际上得到了我们什么有用吗?我不这么认为,所以我们可以将其删除,从而导致(第2次尝试):
SELECT y.webid, y.min_next, webid_diff(y.webid, y.min_next) AS gap
FROM (SELECT a.webid, MIN(b.webid) AS min_next
FROM AnonymousTable AS a, AnonymousTable AS b
WHERE a.webid < b.webid
GROUP BY a.webid
) AS y
WHERE webid_diff(y.webid, y.min_next) > 1;
这确实工作。试图将webid_diff()函数放入内部查询中给我带来了一些问题 - 至少GAP表达式必须包含在GROUP BY子句中,但那会给出错误的答案。
HAVING子句用于应用过滤条件集合体,所以它看起来有点好像查询可能归结为:
SELECT a.webid, MIN(b.webid) AS min_next, webid_diff(a.webid, b.webid) AS gap
FROM AnonymousTable AS a, AnonymousTable AS b
WHERE a.webid < b.webid
GROUP BY a.webid
HAVING webid_diff(a.webid, b.webid) > 1;
然而,这不起作用(对我来说,我的DBMS - IBM Informix Dynamic Server),因为webid_diff()不是聚合。
下面是我用于webid_diff()函数的代码(你必须调整以适应您的DBMS的语法),以及若干辅助webid_num()函数:
CREATE FUNCTION webid_num(a CHAR(4)) RETURNING INTEGER;
DEFINE i INTEGER;
LET i = substr(a, 2, 3);
RETURN i;
END FUNCTION;
CREATE FUNCTION webid_diff(a CHAR(4), b CHAR(4)) RETURNING INTEGER;
DEFINE i, j INTEGER;
LET i = webid_num(a);
LET j = webid_num(b);
RETURN (j - i);
END FUNCTION;
您的评论是有效的。这个问题已被澄清。我建议取消这个答案,以避免反对票。 – 2008-12-31 17:51:25