获得几乎不同的行

时间:2011-02-01 12:22:07

标签: sql sql-server-2000

我有一张这样的表

C1             C2            C3
Mike           London        578
Mike           Bonn          578
Jane           Madrid        245
Billy          Paris         345
Jane           Rome          245

我需要一个查询给我:

C1             C2            C3
Mike           London        578
Jane           Madrid        245
Billy          Paris         345

也就是说,这个查询在C1上给出了类似 distinct 的内容,忽略了C1上相同值的下一次出现。

编辑:请原谅,这只是一个快速的样本,有点似乎诱使你们中的一些人认为C3很重要,我正在编辑它以使它看起来更像真正的表,它有大约50列和有问题的行都是相同的,除了一个值,可以丢弃。

4 个答案:

答案 0 :(得分:1)

如果您不关心数据来自哪条记录,您可以将其写为:

SELECT C1, min(C2), min(C3)
FROM table
GROUP BY C1

这里的问题是min(C2)和min(C3)实际上可以混合来自不同记录的数据。

如果您有主键,则可以轻松避免id:

SELECT C1, C2, C3
FROM table t
WHERE id IN (
  SELECT min(t2.id) 
  FROM table t2
  GROUP BY t2.C1)

答案 1 :(得分:1)

在SQL中确实没有“下一次出现”这样简单的概念,因为默认情况下,集合/关系是无序的。您必须明确说明如何使用ORDER BY子句对行进行排序,然后从该有序关系中选择所需的一行或多行(在SQL Server 2000中使用TOP)。你似乎没有按C3递减排序(因为Jane有346而你想要她245)。隐含在你的单词“next”中的默认顺序(即你想要每个不同的人的第一个行)?您如何在此查询中定义 first ?你想要每个人的C3值最低吗?如果是这样,您可以按人物分组,在内联视图中获取最小值(c3),并将该内联视图连接到另一个内联视图,在该视图中您选择了不同的C1。

答案 2 :(得分:0)

像这样使用RANK()OVER PARITION(2005,2008):

declare @table  as table (c1 nvarchar(10), c2 nvarchar(10), c3 int, id int identity(1,1))

insert into @table values
('Mike',           'London',        578),
('Mike',           'Bonn',          234),
('Jane',           'Madrid',        245),
('Billy',          'Paris',         345),
('Jane',           'Rome',          346)

select c1, c2, c3 from 
( select id, c1, c2, c3, RANK() over ( partition by c1 order by id) as Rank from @table) tmp
where tmp.Rank = 1
order by id 

使用像这样的有趣的WHERE子句(2000):

select t2.*
from
@table t2
where 
(select COUNT(*) from @table t where t.c1=t2.c1 and (t2.c2 > t.c2 or (t2.c2 = t.c2 and t2.c3 > t.c3))) = 1
union
select * from @table where c1 in (select c1 from @table group by c1 having COUNT(*) = 1)

排序与上述不同,但您必须在现实世界数据中对其进行排序。

答案 3 :(得分:0)

我很可能是愚蠢但不同的是选择中所有列的独特组合。

要实现这一目标,您需要更多数据,以确定首先出现哪一行。

这是我鞭打的一些代码......

DECLARE @TBL TABLE(

    ID INT IDENTITY(1,1),
    C1 VARCHAR(100),
    C2 VARCHAR(100),
    C3 INT

)
INSERT INTO @TBL VALUES ('Mike','London',578)
INSERT INTO @TBL VALUES ('Mike','Bonn',234)
INSERT INTO @TBL VALUES ('Jane','Madrid',245)
INSERT INTO @TBL VALUES ('Billy','Paris',345)
INSERT INTO @TBL VALUES ('Jane','Rome',346)

SELECT * FROM @TBL T
WHERE
ID = (SELECT MIN(ID) FROM @TBL CHILD WHERE CHILD.C1 = T.C1)
GROUP BY ID,C1,C2,C3

希望这有帮助吗?