Sql server 显示重复的每一行
我有一个包含重复行的表。例如,这是我的表Sql server 显示重复的每一行,sql-server,Sql Server,我有一个包含重复行的表。例如,这是我的表 OriginalUrl NewUrl /blog /blog es/blog es/blog blog blog 现在我想得到如下副本 输出: OriginalUrl
OriginalUrl NewUrl
/blog /blog
es/blog es/blog
blog blog
现在我想得到如下副本
输出:
OriginalUrl NewUrl
/blog /blog
blog blog
多亏了“Zohar Peled”,我通过这段代码实现了大部分功能
但当我添加不带(/)的博客时,我甚至会将其视为如上所示的副本。但这段代码不会出现这种情况。那么有人能帮我实现这一最终更新吗
在又一次目标转移后,我再次更新了我的CTE。这是最后一次更新,因为即使您打算再次更改您的要求,我也受够了。
请接受我对未来问题的建议:
- 尽你所能定义这个问题
- 以ddl+dml的形式提供最精确的表结构和样本数据。
不要链接到sqlfiddle,因为它有很多停机时间 - 提供最准确的预期输出
- 展示你解决问题的努力
/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
早期版本
因此,重复是指在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')
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)
注意:在询问有关sql的问题时,您应该使用这种方式提供示例数据。通过这种方式,我们可以将您的DDL+DML复制到SQLFIDLE或我们自己的环境中,并实际测试我们给出的答案 我使用了一个隔离的方法来隔离样本数据中最后一个/后面的最后一个单词, 这样我只需要写一次正确的表达式
;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
结果:
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
你能为你的案例清楚地定义什么是“重复”吗?博客或这3个都是重复的。因为只有url改变,而不是产品的名称为什么300r不重复?我必须在“/”问题不清楚后检查答案,但如果有两次,就不会显示博客,我的意思是,如果只有产品博客出现两次,我不知道你的意思,那么。我已经在我的环境中进行了测试,结果完全符合您的预期结果。我本来会提供一个指向sqlfiddle的链接,但它目前不起作用。同时,请再次插入“/blog”并查看结果。它会显示blog一次,即使存在twiceNo,也会向您显示结果窗格,以便您可以查看我得到的结果并告诉我此答案的错误。(我在示例数据中又添加了一个/blog和2个/answer URL,对我来说似乎工作得很好)查看我的上一次编辑。首先,您应该将其包含在示例数据中。这会为我们俩节省一些时间和精力。
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