SQL Server:删除重复记录,但可以按特定列选择要保留的记录

SQL Server:删除重复记录,但可以按特定列选择要保留的记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有问题,就是找不到正确的解决办法。 希望你能帮助我 我有一张这样的桌子: ID Date description location 1 2012-12-01 low A 1 2012-12-01 low A 1 2012-12-01 low B 2 2012-12-01 High A 3 2012-12-01 Low

我有问题,就是找不到正确的解决办法。 希望你能帮助我

我有一张这样的桌子:

ID  Date      description     location
1  2012-12-01   low              A
1  2012-12-01   low              A
1  2012-12-01   low              B
2  2012-12-01   High             A
3  2012-12-01   Low              C
;WITH t AS (
    SELECT *, 
           ROW_NUMBER() OVER (PARTITION BY ID, Date, description 
                              ORDER BY location DESC) As seq
    FROM yourTable)
SELECT ID, Date, description, location -- change this line to `DELETE` for removing
FROM t
WHERE (seq > 1);
结果应该是这样的

ID  Date      description     location
1  2012-12-01   low              B
2  2012-12-01   High             A
3  2012-12-01   Low              C

希望您能帮助我。

使用DISTINCT消除重复行

SELECT ID,Date,description,MAX(location) as location
FROM tableName
GROUP BY ID,Date,description
SELECT DISTINCT ID,Date,description, location
FROM tableName

如果要选择仅重复的记录以将其与最后位置一起删除,请使用如下查询:

ID  Date      description     location
1  2012-12-01   low              A
1  2012-12-01   low              A
1  2012-12-01   low              B
2  2012-12-01   High             A
3  2012-12-01   Low              C
;WITH t AS (
    SELECT *, 
           ROW_NUMBER() OVER (PARTITION BY ID, Date, description 
                              ORDER BY location DESC) As seq
    FROM yourTable)
SELECT ID, Date, description, location -- change this line to `DELETE` for removing
FROM t
WHERE (seq > 1);
通过此查询删除之前,可以预览表的结果:

SELECT ID, Date, description, location
FROM (SELECT *, 
          ROW_NUMBER() OVER (PARTITION BY ID, Date, description 
                                 ORDER BY location DESC) As seq
      FROM yourTable) dt
WHERE (seq = 1);

对行进行优先级排序的一般方法是在case语句中使用row_number

在您的情况下,这似乎是:

select t.*
from (select t.*,
             row_number() over (partition by id, description
                                order by location desc
                               ) as seqnum
      from table t
     ) t
where seqnum = 1;
试试这个

SELECT ID,Date,description,location
FROM tableName
GROUP BY ID,Date,description,location
Having count(location) = 1

你试过分组吗?你是如何确定应该选择B而不是A的?它是按字母顺序排列的吗?也可以只有2个位置A和B,或者可以有任意数量的位置,并且您希望根据某种逻辑选择一个特定的位置?什么决定从哪个位置选择?也许是最高的字母数字值?位置听起来不像是一个可以决定排的顺序的专栏。你的问题还不清楚。您如何知道“B”是为ID 1保留的正确值,而不是“A”?如果1也有可用的“C”值,您会怎么做?编辑您的问题,并完整解释如何从“位置”中选择结果集中应包含的值。请注意最大字符列!如果你有一个像A-Z,AA,AB等这样的excel,这将不起作用。在SQL Server上,AA和B的最大值为B!你的答案与问题中的新数据不符。我不明白你怎么能回答这个问题,即使现在有了额外的答案information@t-克劳森。修改后的代码适用于当前版本。我不确定这是否是OP的意图。我不认为该党派应该包括描述,因为现在的问题是,这是没有必要的,但这是正确的想法。并在测试数据中给出了一个坏例子。