2010-02-01 104 views
34

我需要从以下给出的表中的每个重复记录集中取出第一行中的第一行。 我需要在视图中使用此查询从没有唯一标识的重复记录中获取第一条记录

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

这只是示例数据。原来一直在表中的记录1000,我只需要从顶部1000导致所以不能用不同

我使用SQL Server 2005

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

感谢

+11

+1需要一直做整个屏幕样机!我希望更多的人为他们的问题付出很多努力。 – Aaronaught 2010-02-01 16:50:26

+0

您的图片链接已死亡。 :/ – 2017-10-03 20:03:47

回答

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当然是可选的,如果你不”不关心你返回的记录。

1

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

+1

+1正确,得到给定输入的要求输出:-) – gbn 2010-02-01 16:19:54

+0

对不起,我没有提到我的问题这只是示例数据。原始表中有1000条记录,我只需要从前1000的结果,所以不能使用**清晰** – Kashif 2010-02-01 16:33:01

1

使用DISTINCT应该这样做:

SELECT DISTINCT id, uname, tel 
FROM YourTable 

虽然你可能确实具有该表的主键,这是一种唯一标识每个记录。我会考虑在表格上粘上一个IDENTITY列

+0

对不起,我没有提到我的问题这只是示例数据。原始表格中有1000个记录,我只需要1000个结果,因此不能使用** distinct ** – Kashif 2010-02-01 16:34:41

1

Y我们最好的办法是修复数据库设计并将识别列添加到表中。为什么你首先要摆放一张桌子?特别是有重复记录的一个!显然,数据库本身需要重新设计。

为什么你必须有一个视图,为什么你的解决方案与临时表有效的解决方案?对于一个完美的数据库,视图通常不是一件好事。

+0

您是对的,但请告诉我1)如何说服我的经理在View中需要此解决方案。 2)我从客户端获得了db设计,我必须坚持使用这种设计。 – Kashif 2010-02-02 07:14:29

1

你可以尝试以下方法:

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

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

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

3,成功创建上述观点,只写另一视图,以只选择记录与“RecordRank” = 1

这应该选择来自重复仅在每个记录中的一个或分区。

希望这有助于 - 马尔科姆·桑科

11

找到已被责令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 
+2

这应该是被接受的正确答案 – Fandango68 2014-06-17 06:58:30

1

这里有两种解决办法,我使用Oracle SQL服务器:

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 
6

有时你可以使用CROSS APPLY操作是这样的:

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

在此查询中我使用了第1)只需选择自然发生在我的数据中的许多重复项中的第一项。它适用于SQL Server 2005+数据库。

+2

这就像一个魅力! – MJ33 2015-03-05 10:50:17

+0

谢谢。这解决了我们用重复数据产生的一个相当大的反复出现的问题。 – NotMe 2017-04-07 18:41:05

相关问题