2013-07-22 54 views
1

這應該很簡單,但我無法弄清楚這一點。我需要獲得一行數據,其中該行中的某個字段是該列的最大值,並且該行的某個特定狀態已設置爲按值篩選。查詢SQL語句以查找項目的類型,包含狀態,並且是最新添加的項目

這是表的一個例子:

ID   Date Entered  Item  Status 
1   1/1/2012   Joe  Ready 
2   1/2/2012   Joe  Ready 
3   1/1/2012   Sam  Ready 
4   1/2/2012   Sam  Not Ready 
5   1/2/2012   Sam  Ready 
6   1/1/2013   Jimmy  Not Ready 

,我想回去是結果集:

ID   Date Entered  Item  Status 
2   1/2/2012   Joe  Ready 
5   1/2/2012   Sam  Ready 

這是我多次失敗的嘗試之一迄今:

Select id, max(Date_Entered), Item 
from table1 
where status = 'Ready' 
Group by Item, id 

這會返回太多重複項目

Select max(Date_Entered), RELEASE_GROUP_C 
from table1 
where status = 'Ready' 
Group by item 

這不會返回ID。

+0

什麼數據庫服務器? Oracle,SQL Server,MySQL? – dazedandconfused

+0

我正在使用SQL-Server進行查詢。 – cjohns

回答

2

可以使用ROW_NUMBER()函數爲這樣:

SELECT ID, [Date Entered], Item, Status 
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY Item ORDER BY [Date Entered] DESC)'RowRank' 
     FROM Table1 
     WHERE Status = 'Ready' 
    )sub 
WHERE RowRank = 1 

演示:SQL Fiddle

ROW_NUMBER()功能分配在PARTITION BY部分分組定義了一些每行從1開始的每以及基於ORDER BY部分的訂單,在這種情況下,對於每個Item,它將從最初/最近日期開始編號爲1。

+0

謝謝你是一個很棒的解決方案。 – cjohns

1

是否這樣?

SELECT ID, Date_Entered, Item, Status 
FROM t1 
WHERE 
Status = 'Ready' 
AND 
t1.Date_Entered = (SELECT MAX(Date_Entered) FROM t1) 
+0

我假設他不只是想要所有行的最大日期,只是希望每個項目組的最大日期爲山羊CO用下面的窗口函數表示。這只是一個假設,因爲OP不清晰 – Scotch

0
with CTE_TEMP as 
(
    select 
     *, 
     row_number() over (partition by Item order by Date desc, ID desc) as row_num 
    from temp 
    where Status = 'Ready' 
) 
select * 
from CTE_TEMP 
where row_num = 1 

SQL FIDDLE EXAMPLE