我有一个包含重复行的表。对于ex这是我的表
OriginalUrl NewUrl
/blog /blog
es/blog es/blog
blog blog
现在我想得到重复的内容如下
输出:
OriginalUrl NewUrl
/blog /blog
blog blog
感谢“Zohar Peled”,我通过此代码http://sqlfiddle.com/#!6/c96cc/5完成了大部分内容。
但是当我在没有(/)的情况下添加博客时,我甚至会将其作为副本如上所示。但是这个代码没有发生。所以任何人都可以帮助我实现这个目标
答案 0 :(得分:1)
在换了另一个球门后,我再次更新了我的CTE 这是最后的更新,因为即使你要再次改变你的要求,我已经受够了 请接受我的建议,以便将来提出问题:
这是最后更新的CTE,其他所有内容都保留在上次更新中。 sqlfiddle here.
;WITH CTE AS (
SELECT OriginalUrl,
NewUrl,
RIGHT(OriginalUrl,
LEN(OriginalUrl) -
CHARINDEX('/', OriginalUrl,
CASE WHEN PATINDEX('%://%/%', OriginalUrl) > 0 THEN
PATINDEX('%://%/%', OriginalUrl)+3
ELSE
0
END
)+1
) As Product
FROM MyTable
)
更新了样本数据(再次......)
-- Create sample table and data.
-- DDL
create table MyTable (
OriginalUrl varchar(50),
NewUrl varchar(50)
)
-- DML
insert into MyTable VALUES
('/blog', '/blog'),
('http://gaming.corsair.com/blog', 'http://gaming.corsair.com/blog'),
('http://www.corsair.com/blog', 'http://www.corsair.com/blog'),
('http://www.corsair.com/es/blog', 'http://www.corsair.com/es/blog')
我已将CTE更新为包含在“产品”中的最后一个'/'字符的所有内容,因此前3行的产品现在为/blog
,而最后一行的产品为/es/blog
。因此,URL的协议和域部分之后的所有内容现在都被视为产品。注意 - 这也适用于https
和任何其他协议。
;WITH CTE AS (
SELECT OriginalUrl,
NewUrl,
RIGHT(OriginalUrl,
LEN(OriginalUrl) -
CHARINDEX('/', OriginalUrl,
PATINDEX('%://%', OriginalUrl)+3 -- get the location right after '://'
)+1 -- get the location right after the first / after the patindex
) As Product
FROM MyTable
)
我对新CTE的查询仍然是最后一次尝试:
SELECT T1.OriginalUrl, T1.NewUrl,T2.Product
FROM CTE T1
INNER JOIN (
SELECT Product
FROM CTE
GROUP BY Product
HAVING COUNT(1) > 1
) T2 ON(T1.Product = T2.Product)
这是输出:
OriginalUrl NewUrl Product
---------------------------------------------------------------------------
/blog /blog /blog
http://gaming.corsair.com/blog http://gaming.corsair.com/blog /blog
http://www.corsair.com/blog http://www.corsair.com/blog /blog
You can play with it yourself on sqlFiddle.
因此,重复项是指在OriginalUrl列的最后一个/
之后具有相同字符串的所有行?
如果是这样,您可能想尝试这个:
-- Create sample table and data.
-- DDL
create table MyTable (
OriginalUrl varchar(50),
NewUrl varchar(50)
)
-- DML
insert into MyTable VALUES
('/blog', '/en-us/blog'),
('/blog', '/en-us/blog'),
('http://www.corsair.com/blog', 'http://www.corsair.com/blog'),
('http://gaming.corsair.com/blog', 'http://gaming.corsair.com/blog'),
('blablabla/blog', 'yadayada/blog'),
('I don''t see what is wrong with this/Answer', 'It seems to be working/Fine'),
('Unless my/Answer', 'assumes duplicates as something else then/you'),
('300r', '300r')
注意:在询问有关sql的问题时,您应该使用这种方式提供样本数据 这样我们就可以将您的DDL + DML复制到sqlfiddle或我们自己的环境中,并实际测试我们给出的答案。
我使用了CTE来隔离样本数据中最后一个/之后的最后一个字, 所以我只需要写一次RIGHT表达式。
;WITH CTE AS (
SELECT OriginalUrl,
NewUrl,
RIGHT(OriginalUrl, CASE WHEN CHARINDEX('/', OriginalUrl) > 0 THEN
CHARINDEX('/', REVERSE(OriginalUrl))-1
ELSE
LEN(OriginalUrl)
END) As Product
FROM MyTable
)
SELECT DISTINCT T1.OriginalUrl, T1.NewUrl,T1.Product
FROM CTE T1
INNER JOIN CTE T2
ON(T1.Product = T2.Product)
WHERE T1.OriginalUrl <> T2.OriginalUrl
<强>更新强>
使用相同的CTE,试试这个:
SELECT T1.OriginalUrl, T1.NewUrl,T2.Product
FROM CTE T1
INNER JOIN (
SELECT Product
FROM CTE
GROUP BY Product
HAVING COUNT(1) > 1
) T2 ON(T1.Product = T2.Product)
结果:
OriginalUrl NewUrl Product
-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
I don't see what is wrong with this/Answer It seems to be working/Fine Answer
Unless my/Answer assumes duplicates as something else then/you Answer
/blog /en-us/blog blog
/blog /en-us/blog blog
http://www.corsair.com/blog http://www.corsair.com/blog blog
http://gaming.corsair.com/blog http://gaming.corsair.com/blog blog
blablabla/blog yadayada/blog blog