我有一张这样的表
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列和有问题的行都是相同的,除了一个值,可以丢弃。答案 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
希望这有帮助吗?