我想知道是否可以在 aSELECT
中过滤掉当前行上的文本包含在下一行的文本中的行。
例如,我们记录用户执行的“搜索”的图像,“当他们键入时”:
1 something I searched
2 another search
3 this
4 this is a
5 this is a third
6 this is a third search
7 fourth
8 fourth search
9 here's a ry
10 here's a typo
第3-6 行实际上是相同的——只是用户打字有点“慢”,所以我们保存了多次。
第 7-8 行也一样。
第9-10 行是相同的,但有一个错字。
我正在寻找SELECT
仅返回以下行的操作:
1 something I searched
2 another search
6 this is a third search
8 fourth search
9 here's a ry
10 here's a typo
这样的事情可能吗?
注意 - 完全不能保证 ID 将按特定用户的顺序排列。所以,我不能简单地JOIN
用表本身,由id = id+1
. 我能做的就是ORDER BY id
把它们整理好。
你会想要使用一个窗口函数,特别是这个
LEAD()
函数会在这里很好地使用,如下所示:如果你想全局删除冗余搜索,不管是哪个用户输入了搜索,你可以
PARTITION BY
像这样删除窗口函数的子句IF(LEAD(searchText) OVER (userId ORDER BY id) LIKE CONCAT(searchText, '%'), 1, 0) IsRedundantSearch
。以上将完成您给定示例的输出。请注意,它仅查看下1 行(按 id 列排序)并检查该行是否以与当前行相同的搜索文本开头。您可以通过在运算符的前面添加另一个通配符来使其执行完整的包含检查,如下所示。
%
searchText
CONCAT()
CONCAT('%', searchText, '%')
窗口函数是这里解决方案的
LEAD()
关键,因为它可以在您指定的任意多行输入的列中进行前瞻。它预读的默认行数为 1,但如果您想查看前 3 行而不是下一行,则预读LEAD(searchText, 3)
3 行。