选择重复项

时间:2018-07-26 04:08:11

标签: tsql

我只想检索重复记录而不是唯一记录。假设我有以下数据组成,例如Ids 1,2,1名称A,B,A,数量10、15、20我想要Sno 1 Id 1,Name A数量10,Sno 2 Id 1名称A,数量20

请提出建议。

谢谢 萨西

3 个答案:

答案 0 :(得分:1)

请尝试一下,如果不清楚,请告诉我-如果您无法理解以下代码,请不要提出其他问题:

DECLARE @DataSource TABLE
(
    [ID] INT
   ,[name] CHAR(1)
   ,[Quantity] INT 
);

INSERT INTO @DataSource ([ID], [name], [Quantity])
VALUES (1, 'A', '10')
      ,(2, 'B', '15')
      ,(1, 'A', '20');

WITH DataSource AS
(
    SELECT *
          ,COUNT(*) OVER (PARTITION BY [ID], [name]) AS [Count]
    FROM @DataSource
)
SELECT [ID]
      ,[name]
      ,[Quantity]
FROM Datasource
WHERE [Count] > 1;

enter image description here

语句的第一部分使用CTE。它允许先计算一些东西然后再使用它。在我们的示例中,这是以下行:

COUNT(*) OVER (PARTITION BY [ID], [name]) AS [Count]

我们正在使用OVER函数的COUNT子句,在其PARTITION BY子句中指定要用于分组的列。如果仅运行上面的代码行,则会得到以下代码:

SELECT *
      ,COUNT(*) OVER (PARTITION BY [ID], [name]) AS [Count]
FROM @DataSource;

enter image description here

您可以看到Count列显示了多少行包含一对唯一的IDname值。使用window函数,我们可以使用不同的分组执行汇总并获取每一行的值。

现在,剩下的就是从公用表表达式中查询此数据,并仅显示Count1大的行。

答案 1 :(得分:0)

更多一般解决方案:

SELECT t1.Id, t1.Name, t1.Quantity
FROM MyTable t1 JOIN (
    SELECT Id, Name
    FROM MyTable
    GROUP BY Id, Name
    HAVING COUNT(*) > 1
) t2 ON t1.Id = t2.Id AND t1.Name = t2.Name

答案 2 :(得分:0)

像您的请求一样,您需要创建一个新列[SNo],该列在原始列(名称,ID)上进行了分区。 [SNo]> 1的重复项。要进行过滤,只需获取Duplicates> 1。在下面查看样机:

enter image description here

DECLARE @Records TABLE (Id int, Names VARCHAR(10), [Quantity] INT)
INSERT INTO @Records
SELECT 1, 'A',10 UNION ALL
SELECT 2, 'B',15 UNION ALL
SELECT 1, 'A',20



----To Get Duplicates -----

    SELECT SNo, Id, Names, Quantity

    FROM
    (
    SELECT 
        SNo=ROW_NUMBER()over(PARTITION BY Names,Id order by Id),
        Duplicates=COUNT(*) OVER (PARTITION BY [ID], Names),
        *
    FROM
        @Records
    )M
    WHERE 
        Duplicates>1