从没有唯一标识的重复记录中获取最高记录

时间:2010-02-01 16:10:10

标签: sql sql-server-2005 tsql

我需要从下面给出的表中的每个重复记录集中获取最高的第一行。 我需要在视图中使用此查询

请不要临时表,因为我已经通过添加标识列和分钟功能和分组来完成它。我需要没有临时表或表变量的解决方案

这只是示例数据。原始表中有1000条记录,我只需要前1000名的结果,所以不能使用不同

我正在使用SQL Server 2005

alt text http://img686.imageshack.us/img686/42/duplicate.png

感谢。

9 个答案:

答案 0 :(得分:12)

查找已订购1次或更多次的所有产品......(重复记录的种类)

SELECT DISTINCT * from [order_items] where productid in 
(SELECT productid 
  FROM [order_items]
  group by productid 
  having COUNT(*)>0)
order by productid 

选择最后插入的那些......

SELECT DISTINCT productid, MAX(id) OVER (PARTITION BY productid) AS LastRowId from [order_items] where productid in 
(SELECT productid 
  FROM [order_items]
  group by productid 
  having COUNT(*)>0)
order by productid 

答案 1 :(得分:7)

有时您可以像这样使用CROSS APPLY运算符:

select distinct result.* from data d
cross apply (select top 1 * from data where data.Id = d.Id) result

在这个查询中,我只需要选择自然碰巧在我的数据中出现的许多重复项中的第一个。它适用于SQL Server 2005+数据库。

答案 2 :(得分:6)

答案取决于具体的“1000个不同”记录的含义。

如果您的意思是要返回最多1000条不同的记录,无论表中有多少重复记录,请写下:

SELECT DISTINCT TOP 1000 id, uname, tel
FROM Users
ORDER BY <sort_columns>

如果您只想搜索表中的前1000行,并且可能返回少于1000个不同的行,那么您可以使用子查询或CTE编写它,如下所示:

SELECT DISTINCT *
FROM
(
    SELECT TOP 1000 id, uname, tel
    FROM Users
    ORDER BY <sort_columns>
) u

如果您不关心返回哪条记录,ORDER BY当然是可选的。

答案 3 :(得分:1)

SELECT DISTINCT有帮助吗?我想它会返回你想要的结果。

答案 4 :(得分:1)

使用DISTINCT应该这样做:

SELECT DISTINCT id, uname, tel
FROM YourTable

虽然您可以真正使用该表上的主键,但这是一种唯一标识每条记录的方法。我正在考虑在桌面上贴上IDENTITY专栏

答案 5 :(得分:1)

最好的办法是修复数据库设计并在表格中添加identioty列。为什么你首先没有一张桌子?特别是有重复记录的人!显然,数据库本身需要重新设计。

为什么你必须在视图中有这个,为什么你的临时表解决方案不是一个有效的解决方案?对于一个非常好的数据库来说,视图通常不是一件好事。

答案 6 :(得分:1)

您可以尝试以下操作:

  1. 创建一个视图,该视图只选择原始表中的所有列,但添加一个额外的数字列,其值随每个记录\行增加。您可能需要将此列设置为非整数列(例如十进制,并将每个记录递增1.00以在RANK()SQL语句中使用它。)

  2. 还添加另一列(例如'RecordRank')以包含所有列的计算排名值,使用RANK()OVER SQL子句为此列创建值 - 请参阅下面的参考。 RANK语句允许您对记录进行分区,然后根据按行的顺序中的值对每个分区记录进行排序(使用第1步中增加值的列作为您的订单)。您可以在partition子句中使用具有相同数据的列,以便将所有这些类似的重复项分区或组合在一起,然后按额外列中的值排序(按步骤1中的列排序)。

    http://msdn.microsoft.com/en-us/library/ms189461.aspx

  3. 3,成功创建上述视图后,只需编写另一个视图,只选择“RecordRank”= 1的记录

    这应该只从重复项或分区中选择每条记录中的一条。

    希望这有帮助 - malcom sankoh

答案 7 :(得分:1)

以下是两个解决方案,我使用的是Oracle SQL服务器:

1)使用over子句:

    with org_table as
 (select 1 id, 'Ali' uname
    from dual
  union
  select 1, 'June'
    from dual
  union
  select 2, 'Jame'
    from dual
  union
  select 2, 'July' from dual)
select id, uname
  from (select a.id,
               a.uname,
               ROW_NUMBER() OVER(PARTITION BY a.id ORDER BY a.id) AS freq

          from org_table a)
 where freq = 1

2)使用子查询:

    with org_table as
 (select 1 id, 'Ali' uname
    from dual
  union
  select 1, 'June'
    from dual
  union
  select 2, 'Jame'
    from dual
  union
  select 2, 'July' from dual)

select a.id,
       (select b.uname
          from org_table b
         where b.id = a.id
           and rownum = 1)
  from (select distinct id from org_table) a

答案 8 :(得分:-2)

SELECT TOP 1000 MAX(tel) FROM TableName WHERE Id IN 
(
SELECT Id FROM TableName
GROUP BY Id
HAVING COUNT(*) > 1
) 
GROUP BY Id