如何使用5个字段删除SELECT请求中的重复行

时间:2015-04-20 13:26:23

标签: sql sql-server

我需要在SELECT语句中选择5个字段。

这5个字段中有2个是不同的,所以当我尝试只有这两个字段的SELECT时,我会得到我想要的结果(我在这个请求中只放了DISTINCT)。

其他3个字段不同,因此当我将它们添加到SELECT语句时,DISTINCT还不够。我得到重复的行。

目的是使用两个字段获取我的请求的结果,然后将结果行添加到顶部1,例如其他字段。有可能吗?

这是请求:

      -- Here Id, Description, and Image are differents and give duplicate rows
    SELECT DISTINCT Title, GroupingId, Id, Description, Image
        FROM dbo.AllContent     
        WHERE Title like '%'+'harr'+'%'
        AND Rating <> 18

--result 89 rows...

    -- No problems withs these fields   
    SELECT Title,GroupingId
        FROM dbo.AllContent     
        WHERE Title like '%'+'harr'+'%'
        AND Rating <> 18

--result 28 rows...

可以在5个字段中使用GROUP BY语句吗?

我使用第一个请求添加输出(5个字段)

Title   |  Id   |  GroupingId   |  Description  |  Image
Title1     1           1           Description1    1.jpg
Title1     2           1           Description2    2.jpg
Title1     3           1           Description3    3.jpg
Title4     4           4           Description4    4.jpg
Title5     5           5           Description5    5.jpg
Title5     6           5           Description6    6.jpg

然后请求包含2个字段:

Title   |  GroupingId
Title 1        1     
Title 4        4
Title 5        5

我需要什么:

Title   |   Id  | GroupingId   |  Description   |  Image
Title 1     1         1          Description 1       1.jpg
Title 4     4         4          Description 4       4.jpg
Title 5     5         5          Description 5       5.jpg

4 个答案:

答案 0 :(得分:1)

我真的不知道你在where子句中想要什么,所以你可以添加它。但这应该做你需要的。

SELECT  Title,
        MIN(ID) AS ID,
        GroupingID,
        MIN([Description]) AS [Description],
        MIN([Image]) AS [Image]
FROM dbo.AllContent 
GROUP BY Title,GroupingID

答案 1 :(得分:0)

您可以使用row_number()

从每个2列组中选择任意行
SELECT Title, GroupingId, Id, Description, Image
FROM (SELECT ac.*,
             r
      FROM dbo.AllContent ac     
      WHERE ac.Title like '%'+'harr'+'%' AND Rating <> 18
     ) ac
WHERE seqnum = 1

答案 2 :(得分:0)

根据上面提供的示例,这应该适合您。

    SELECT Title, GroupingId, Id, Description, Image
    FROM dbo.AllContent     
    WHERE Title like '%'+'harr'+'%'
    AND Rating <> 18
    AND Id in (1,4,5)  

答案 3 :(得分:-1)

This one有100个赞成票。使用它后我爱上了CTE。为什么不尝试这个!!

WITH CTE AS(
   SELECT [col1], [col2], [col3], [col4], [col5], [col6], [col7],
       RN = ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col1)
   FROM dbo.Table1
)
DELETE FROM CTE WHERE RN > 1