显示重复的每一行

时间:2015-05-12 05:55:19

标签: sql-server

我有一个包含重复行的表。对于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完成了大部分内容。

但是当我在没有(/)的情况下添加博客时,我甚至会将其作为副本如上所示。但是这个代码没有发生。所以任何人都可以帮助我实现这个目标

1 个答案:

答案 0 :(得分:1)

最终更新

在换了另一个球门后,我再次更新了我的CTE 这是最后的更新,因为即使你要再次改变你的要求,我已经受够了 请接受我的建议,以便将来提出问题:

  • 尽可能地解决问题。
  • 提供最准确的表格结构和样本数据为ddl + dml 不要链接到sqlfiddle,因为它会遭受大量停机。
  • 提供最准确的预期输出
  • 展示您为解决问题所做的努力。

这是最后更新的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