2009-10-07 80 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記錄領帶,它會同時返回,這可能是有利的還是痛苦的,取決於你所需要的,它可以放在一個使用不同的選擇。