Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 返回Select语句结果中出现的前三个字符串_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Tsql 返回Select语句结果中出现的前三个字符串

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

我有一张三列的桌子。第一列是PK。第二列包含5个不同的URL(URL是流程中的步骤,一个URL表示步骤1,等等)。第三列包含用户代理字符串

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”=公共表表达式()