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

Kas*_*hif 34 sql t-sql sql-server-2005

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

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

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

我正在使用SQL Server 2005

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

谢谢.

HGM*_*aci 13

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

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

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

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 
Run Code Online (Sandbox Code Playgroud)

  • 这应该是接受的正确答案 (2认同)

Aar*_*ght 7

答案取决于具体的"前1000个不同"记录的含义.

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

SELECT DISTINCT TOP 1000 id, uname, tel
FROM Users
ORDER BY <sort_columns>
Run Code Online (Sandbox Code Playgroud)

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

SELECT DISTINCT *
FROM
(
    SELECT TOP 1000 id, uname, tel
    FROM Users
    ORDER BY <sort_columns>
) u
Run Code Online (Sandbox Code Playgroud)

ORDER BY如果选购你不关心当然是哪些记录你回来.


Már*_*les 7

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

select distinct result.* from data d
cross apply (select top 1 * from data where data.Id = d.Id) result
Run Code Online (Sandbox Code Playgroud)

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