实际上,这并不是特定于SQL,我怀疑“会话模式”是正确的名称,但我想不出更好的标题。
为了简化,想象一下你有大量的整数。任务是检测A.{1;max_n}A
模式:如果int后面跟着n(> 0)其他整数,则int满足该模式,然后再次满足原始int,而n <= max_n。
示例:
...
1
4 <--
7 \
3 > n = 3
3 /
4 <--
2
...
这里,int 4
重复使用3个任意整数,因此对于max_n&lt; = 3,值4
满足模式。
问题是,如何检测大量数据转储中的哪些整数遵循此模式?我最感兴趣的是算法本身,但是SQL或C#中的一个例子也是受欢迎的。
我提出的天真想法是首先收集列表或所有不同的整数,然后以直接的方式检查每个模式,但这会导致性能瓶颈。
答案 0 :(得分:1)
你可以保存一些字典(C#)或地图(C ++)结构,保存第一次出现数字的位置。
然后,对于每个数字,您应该检查它是否出现在地图中。如果是 - 您应该比较位置差异与之前发生的最大位置差异。否则,您应该在地图中保存数字及其位置。
答案 1 :(得分:0)
好吧,SQL不会以最佳方式执行此操作,但如果对列进行索引,则可能并不可怕。
首先,要谈谈SQL中的顺序,您应该有另一列。如果该列实际上等于行号,那么您可以:
SELECT DISTINCT
t1.number
FROM
table t1, table t2
WHERE
(t1.rownumber-t2.rownumber) <= @max_n AND
(t1.rownumber-t2.rownumber) >=1 AND
t1.number = t2.number AND