我需要从下面给出的表中的每个重复记录集中获取最高的第一行。 我需要在视图中使用此查询
请不要临时表,因为我已经通过添加标识列和分钟功能和分组来完成它。我需要没有临时表或表变量的解决方案
这只是示例数据。原始表中有1000条记录,我只需要前1000名的结果,所以不能使用不同
我正在使用SQL Server 2005
alt text http://img686.imageshack.us/img686/42/duplicate.png
感谢。
答案 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.00以在RANK()SQL语句中使用它。)
还添加另一列(例如'RecordRank')以包含所有列的计算排名值,使用RANK()OVER SQL子句为此列创建值 - 请参阅下面的参考。 RANK语句允许您对记录进行分区,然后根据按行的顺序中的值对每个分区记录进行排序(使用第1步中增加值的列作为您的订单)。您可以在partition子句中使用具有相同数据的列,以便将所有这些类似的重复项分区或组合在一起,然后按额外列中的值排序(按步骤1中的列排序)。
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