Tsql 返回Select语句结果中出现的前三个字符串
我有一张三列的桌子。第一列是PK。第二列包含5个不同的URL(URL是流程中的步骤,一个URL表示步骤1,等等)。第三列包含用户代理字符串Tsql 返回Select语句结果中出现的前三个字符串,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我有一张三列的桌子。第一列是PK。第二列包含5个不同的URL(URL是流程中的步骤,一个URL表示步骤1,等等)。第三列包含用户代理字符串 SELECT * FROM UserAgent WHERE URL LIKE '%Step2%' ORDER BY UserAgentString; 我想根据在特定步骤中出现的次数返回前三个用户代理字符串。我该怎么做 如果有更好的方法查询所需的结果集,我愿意听取任何建议。试试这个 WITH CTE AS( SELECT Col1,Col2,C
SELECT * FROM UserAgent WHERE URL LIKE '%Step2%' ORDER BY UserAgentString;
我想根据在特定步骤中出现的次数返回前三个用户代理字符串。我该怎么做
如果有更好的方法查询所需的结果集,我愿意听取任何建议。试试这个
WITH CTE AS(
SELECT Col1,Col2,Col3,LEN(Col2)-LEN(REPLACE(Col2,Col3,'')) Occurance
FROM UserAgent
)
SELECT TOP (3) Col1,Col2,Col3
FROM CTE
ORDER BY Occurance
JayDipJ发布的内容是有效的,但只有当col3的长度为1时才有效。请查看以下示例代码:
-- Sample data:
DECLARE @userAgent TABLE (col2 varchar(100), url varchar(100));
INSERT @userAgent VALUES
('dog','this dog, that dog... Dogs?'),
('cat','cats, cats, cats and more cats'),
('bird', 'bird, bird!'),
('xxx', 'xxx yyy zzz');
-- solution:
SELECT TOP (3) *, Occurances = (LEN(url) - LEN(REPLACE(url,col2,''))) / LEN(col2)
FROM @userAgent
ORDER BY (LEN(url) - LEN(REPLACE(url,col2,''))) / LEN(col2) DESC;
但是,需要注意的是,如果存在任何重叠值,此方法将失败。例如,字符串“.”在此处出现四次:“…”;上述方法将返回错误的答案。在可能存在重叠的情况下,我将使用Ngrams8K()。NGrams8K解决方案如下所示:
-- sample data with overlapping values:
DECLARE @userAgent TABLE (col2 varchar(100), url varchar(100));
INSERT @userAgent VALUES ('..', 'blah... blah...'), ('!!', 'Fantastic!!!'),('xx','abc');
-- solution:
SELECT url, Occurances = COUNT(*)
FROM @userAgent
CROSS APPLY dbo.NGrams8k(url, LEN(col2))
WHERE token = col2
GROUP BY ALL url;
结果:
url Occurances
----------------- -----------
abc 0
blah... blah... 4
Fantastic!!! 2
提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,
sql-server-2014
)标记数据库问题很有帮助。语法和功能的差异通常会影响答案。“使用CTE作为(…)”是指创建临时表吗?不,不是创建临时表,只是临时显示结果集“CTE”=公共表表达式()