2009-10-07 79 views
0

比方说,我有以下示例表SQL Server查询 - 找到第一个序列

GroupID  ItemID   Created 
----------------------------------------------- 
A    ABC    5/1/2009 13:02 
A    XZY    5/1/2009 13:01 
A    LMO    5/1/2009 13:03 
A    DEF    5/1/2009 13:00 
A    PQR    5/1/2009 13:04 
B    WXY    5/1/2009 13:02 
B    HIJ    5/1/2009 13:03 
B    STU    5/1/2009 13:01 

我怎样才能返回第一个项目ID基于创建列各组?我需要一个查询返回以下:

GroupID  ItemID   Created 
----------------------------------------------- 
A    DEF    5/1/2009 13:00 
B    STU    5/1/2009 13:01 

我正在使用的数据集可以有几千元到几百万行,所以我想如果可能的话,以避免任何昂贵的子查询。我在想也许我可以用内连接来完成,但是我最初的尝试导致了我自己的困惑。

编辑:到目前为止,我有以下几点:

select t2.ItemID, count(*) from 
    (select GroupID, min(created) as created from table) t1 
     inner join table t2 on t1.created = t2.created 
group by t2.itemid 

任何原因,这是行不通的?它比我想要的要慢,但它更新了汇总表,所以它不是一个大问题。

回答

0
select m1.Groupid, m1.itemid, m1.created 
from mytable m1 
join 
(select groupid,min(created) as created from mytable) m2 
    on m1.groupid = m2.group_id and m1.created = m2.created 
+0

我刚刚通过类似的原始问题更新,但似乎我忘记加入组ID。谢谢! – Chris 2009-10-07 13:36:27

1
SELECT myTable.* 
FROM myTable 
INNER JOIN (
SELECT GroupID, Min(Created) AS MinCreated 
FROM myTable) AS SummarizedTable 
ON myTable.GroupID = SummarizedTable.GroupID 
WHERE myTable.Created = SummarizedTable.MinCreated 

注意:在没有查询分析器的帮助下完成。所以,请亲切:)

1

没有内部连接需要。经典PARTITION BY问题。 未经测试,但这应该把你放在正确的轨道上。

SELECT RowNumber() OVER(PARTITION BY GroupID ORDER BY Created ASC) AS RowNum, * 
FROM YourTable 
+1

谢谢,但我可能需要在以后将它移动到mysql,所以我试图保持尽可能通用。 – Chris 2009-10-07 13:39:50

1

依赖于SQL Server版本,但2005年开始有排名功能,这可以简化它

Select GroupID, ItemID, Created 
FROM 
(
    select GroupID, ItemID, Created, DENSE_RANK () OVER (partition by GroupID 
    order by Created asc) as Rank 
    from yourTable 
) as A 
where Rank = 1 

一个说明,虽然是,如果2记录领带,它会同时返回,这可能是有利的还是痛苦的,取决于你所需要的,它可以放在一个使用不同的选择。