【问题标题】:MS SQL Server where exist same rows存在相同行的 MS SQL Server
【发布时间】:2017-08-03 08:02:55
【问题描述】:

我有这样的桌子

TABLE1

DATE                     NAME  PRODUCT    VERSION       Colour    SIZE    ID
2017-08-03 01:30:20.000  Bob   Mouse      12            Pink      3      461
2017-08-03 01:30:20.000  Bob   Mouse      12            Pink      3      446
2017-08-03 01:30:20.000  Bob   Mouse      13            Pink      3      487
2017-08-03 01:30:20.000  Bob   Honey      6             Red       5      476
2017-08-03 01:30:20.000  Bob   Honey      6             Blue      5      774
2017-08-03 01:30:20.000  Bob   Shoe       6             Black     5      487
2017-08-03 01:30:20.000  Bob   Dog        5             Black     7      1874
2017-08-03 01:30:20.000  Bob   Dog        5             Black     7      999
2017-08-03 01:30:20.000  Bob   Pet        689           Red       9      855
2017-08-02 01:30:20.000  Eva   Mouse      12            Pink      3      461
2017-08-02 01:30:20.000  Eva   Mouse      12            Pink      3      446

结果应该是这样的:

TABLE1

DATE                     NAME  PRODUCT    VERSION       Colour    SIZE    ID
2017-08-03 01:30:20.000  Bob   Mouse      12            Ping      3      446
2017-08-03 01:30:20.000  Bob   Mouse      13            Ping      3      487
2017-08-03 01:30:20.000  Bob   Honey      6             Red       5      476
2017-08-03 01:30:20.000  Bob   Shoe       6             Black     5      487
2017-08-03 01:30:20.000  Bob   Dog        5             Black     7      1874
2017-08-03 01:30:20.000  Bob   Pet        689           Red       9      855
2017-08-02 01:30:20.000  Eva   Mouse      12            Pink      3      446

我最感兴趣的是:Product AND Version

如果不同,则应删除包含相同PRODUCT AND VERSION 的行

问题在于ID 列,我总是有不同的ID 数字,但有不同的NAME 我有相同的ID

【问题讨论】:

  • 表格有 100000 行。这是事情的例子。
  • select * from (select row_number()over(partition by NAME,PRODUCT,VERSION order by ID desc) rn,* from.. ) a where rn = 1
  • 如果日期、名称、颜色或大小也不同怎么办?
  • 所以你不关心ID的值?你用ID=461 删除(Mouse|12) 行,但用ID=446 保留两条这样的记录
  • Zohar Peled- 保留名称、产品和版本。之后是 Group By 和 COUNT。

标签: sql database sql-server-2008


【解决方案1】:

如果您只需要选择此类数据或需要将其删除,则有以下示例:

create table #test
(
   [DATE] DateTime2(7),
   [NAME] VARCHAR(200),
   [PRODUCT] VARCHAR(200),
   [VERSION] INT,
   [Colour] VARCHAR(200),
   [SIZE] INT,
   [ID] INT
);

INSERT INTO #test VALUES ('2017-08-03 01:30:20.000',  'Bob',   'Mouse',      12,            'Pink',      3,      461);
INSERT INTO #test VALUES ('2017-08-03 01:30:20.000',  'Bob',   'Mouse',      12,            'Pink',      3,      446);
INSERT INTO #test VALUES ('2017-08-03 01:30:20.000',  'Bob',   'Mouse',      13,            'Pink',      3,      487);
INSERT INTO #test VALUES ('2017-08-03 01:30:20.000',  'Bob',   'Honey',      6,             'Red',       5,      476);
INSERT INTO #test VALUES ('2017-08-03 01:30:20.000',  'Bob',   'Honey',      6,             'Blue',      5,      774);
INSERT INTO #test VALUES ('2017-08-03 01:30:20.000',  'Bob',   'Shoe',       6,             'Black',     5,      487);
INSERT INTO #test VALUES ('2017-08-03 01:30:20.000',  'Bob',   'Dog',        5,             'Black',     7,      1874);
INSERT INTO #test VALUES ('2017-08-03 01:30:20.000',  'Bob',   'Dog',        5,             'Black',     7,      999);
INSERT INTO #test VALUES ('2017-08-03 01:30:20.000',  'Bob',   'Pet',        689,           'Red',       9,      855);
INSERT INTO #test VALUES ('2017-08-02 01:30:20.000',  'Eva',   'Mouse',      12,            'Pink',      3,      461);
INSERT INTO #test VALUES ('2017-08-02 01:30:20.000',  'Eva',   'Mouse',      12,            'Pink',      3,      446);


SELECT 
   [DATE] ,
   [NAME],
   [PRODUCT],
   [VERSION],
   [Colour],
   [SIZE],
   [ID] 
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY [PRODUCT], [VERSION] ORDER BY [ID]) rn
FROM #test
) a
WHERE rn = 1;


DELETE FROM #test WHERE ID IN (SELECT 
   [ID] 
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY [PRODUCT], [VERSION] ORDER BY [ID]) rn
FROM #test
) a
WHERE rn > 1);

SELECT * FROM #test;

DROP TABLE #test;

【讨论】:

  • 但是 EVA 走了还好。
  • 然后澄清问题。您可以通过在 PARTITION BY 部分中指定右列列表来控制唯一性
猜你喜欢
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
相关资源
最近更新 更多