Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 选择重复记录_Sql Server_Tsql - Fatal编程技术网

Sql server 选择重复记录

Sql server 选择重复记录,sql-server,tsql,Sql Server,Tsql,我只想检索重复的记录,而不是唯一的记录。 假设我有如下数据 Ids Names 1 A 2 B 1 A 我希望像下面这样的输出: Sno Id Name 1 1 A 2 1 A 试试这个: DECLARE @DataSource TABLE ( [ID] INT ,[name] CHAR(1) ,[value] CHAR(2) ); INSERT INTO @DataSource ([ID], [name], [value]) VALUES (1,

我只想检索重复的记录,而不是唯一的记录。 假设我有如下数据

Ids Names 
1  A
2  B
1  A
我希望像下面这样的输出:

Sno Id Name 
1  1 A 
2  1 A 
试试这个:

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

INSERT INTO @DataSource ([ID], [name], [value])
VALUES (1, 'A', 'x1')
      ,(2, 'B', 'x2')
      ,(1, 'A', 'x3');

WITH DataSource AS
(
    SELECT *
          ,COUNT(*) OVER (PARTITION BY [ID], [name]) AS [Count]
    FROM @DataSource
)
SELECT *
FROM Datasource
WHERE [Count] > 1;
分组部分是在分区中按窗口函数的一部分完成的。因此,基本上,我们计算每个唯一ID-名称对的记录。当然,您可以在此处添加更多列。

与您的请求一样,您需要创建一个新列[SNo],该列在原始列名称Id上进行分区。那些[SNo]>1的列是重复的。要进行筛选,只需获取RCount>1。 请参见下面的模型:

 DECLARE @Records TABLE (Id int, Names VARCHAR(10))
INSERT INTO @Records
SELECT 1, 'A' UNION ALL
SELECT 2, 'B' UNION ALL
SELECT 1, 'A'



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

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

非常感谢。请建议,如果我有另一个专栏,它不是重复记录的一部分。假设有Name2列。但是我希望Count*只基于前两列。MINName2/maxmame2/first_值,或者如果要获取所有重复项,请使用row_number重写查询,而此代码段可能会回答问题,这是一个很好的实践,有一些解释性的文字说明为什么这是答案,并帮助原始海报自己发现这一点。
 DECLARE @Records TABLE (Id int, Names VARCHAR(10))
INSERT INTO @Records
SELECT 1, 'A' UNION ALL
SELECT 2, 'B' UNION ALL
SELECT 1, 'A'



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

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