SQL重复行

时间:2015-06-05 16:59:45

标签: sql sql-server

我是SQL新手,想知道是否有人可以帮我解决问题。 我有一个包含以下信息的表:

firstname lastname  group   orderinggroup    date 
tim          s        A          Facebook    6/4/13
tim          s        A          Facebook    6/4/13
tim          s        A          Facebook    6/4/13
dan          d        B          Google      4/5/12
dan          d        B          Google      4/5/12

这样的事情。我希望它看起来像这样

firstname lastname  group   orderinggroup    date 
  tim          s        A          Facebook    6/4/13
  dan          d        B          Google      4/5/12

蒂姆和丹没有重复的地方。我尝试使用DISTINCT,但只有一个列不同,我实际上有很多人名为Tim,Dan,A / B组等。我想知道是否有一种方法可以采取不同的多种角色,例如, firstname,lastname,group,orderinggroup和date的区别。姓氏很重要。谢谢!

3 个答案:

答案 0 :(得分:0)

你真的可以使用max()函数来聚合一些列,并执行以下操作:

select 
     firstname, 
     lastname, 
     [group], 
     max(orderinggroup) as orderinggroup, 
     max([date]) as [date] 
from (VALUES
('tim','s','A','Facebook','6/4/13'),
('tim','s','A','Facebook','6/4/13'),
('tim','s','A','Facebook','6/4/13'),
('dan','d','B','Google','4/5/12'),
('dan','d','B','Google','4/5/12')) as A (firstname,lastname,[group],orderinggroup,[date])  
--replace this with your tablename  
GROUP BY firstname, lastname, [group]
ORDER BY [group]

答案 1 :(得分:0)

这是糟糕的数据,DISTINCT会起作用。 DISTINCT实际上很棒。

SELECT DISTINCT * from table

为什么甚至列出列,除非有直接操作或子查询?在你的陈述中甚至没有JOIN。请告诉我评论为什么DISTINCT在这种情况下不起作用,因为你之前提到过它。

DISTINCT检查每列是否匹配值,如果它匹配记录B中记录A不匹配的值,它也会吐出记录B,因为它与A不同。即使之前的所有内容都是如此。它匹配。

在你的例子中:

firstname lastname  group   orderinggroup    date 
tim          s        A          Facebook    6/4/13
tim          s        A          Facebook    6/4/13
tim          s        A          Facebook    6/4/13
dan          d        B          Google      4/5/12
dan          d        B          Google      4/5/12

让我们从蒂姆开始吧。每个领域都完全一样。因此,Distinct会将所有这些记录折叠成一行。丹一样。现在,如果您的实际数据库中的姓氏不同(应该反映在您的示例中),那么DISTINCT将无效。但是,你的问题的前提需要改变。您需要辨别出您希望在数据集中反映的内容。你想忽略姓氏吗?你想考虑一下吗?这些问题是相关的。 Group By也可以,但由于您没有进行聚合,因此没有必要。我希望这会有所帮助。

答案 2 :(得分:-2)

您可以使用以下查询:

SELECT firstname, lastname, group, orderinggroup, date
FROM tablename
GROUP BY firstname, lastname, group, orderinggroup, date
HAVING count(*) = 1;