2009-10-29 60 views
1

我需要編寫一個SQL查詢,它將從表中獲取具有文件最大值的那些行。獲取數據庫表中的行的最大值

數據庫表如下:

> ID status dept files 
> 
> > 1 1 23 1256637314 
> > 
> > 1 1 39 1256642968 
> > 
> > 2 0 85 1256551419 
> > 
> > 2 1 90 1256642968 
> > 
> > 2 1 93 1256810937 
> > 
> > 3 0 20 1256642968 
> > 
> > 5 1 342 1256810937 

現在從這個表我想那些具有最大文件由ID分組行:

> ID status dept files 
> 
> 1 1 39 1256642968 
> 
> 2 1 93 1256810937 
> 
> 3 0 20 1256642968 
> 
> 5 1 342 1256810937 

任何建議?

謝謝。

我試過,但這樣是不對的

Select ID, Status, dept,files 
from SLAStat 
where files in (Select Max(files) from SLAStat group by ID) 




2 1 90 1256642968 
1 1 39 1256642968 
3 0 20 1256642968 
5 1 342 1256810937 
2 1 93 1256810937 
+0

你有主鍵嗎? – AnthonyWJones 2009-10-29 15:45:14

+0

不存在主鍵 – user175084 2009-10-29 15:46:53

回答

4

通過你的表替換@ T1:

With idT as (
    select ID 
    from @t1 
    group by id 
) 
select applyT.* 
from idT p 
CROSS APPLY (
    select top 1 * from @t1 where ID=p.ID order by files desc 
) as applyT 
+0

這真是太棒了......是否有一個地方我可以閱讀有關如何查詢這樣的內容......這將是一個很好的學習體驗對我來說。 – user175084 2009-10-29 16:13:37

+0

SQL是一種有趣的語言。它需要練習(不僅僅是學習語法)來編寫好的查詢。如果我可以給你一個指針,我會告訴你使用「With」來分隔查詢中的不同步驟,而不是寫入長查詢。查詢優化器將負責爲您分配with的值。 CROSS APPLY也是一個非常棒的功能(它也容易推理)。 – Nestor 2009-10-29 16:20:00

2
SELECT DISTINCT a.ID, a.Status, a.Dept, a.Files 
FROM table a 
INNER JOIN (
SELECT ID, MAX(files) AS Files 
FROM table 
GROUP BY ID) b ON a.ID = b.ID AND a.Files = b.Files 
+0

這並不能保證每個ID有一行(如果有兩個ID具有相同的文件,那麼您將得到該ID的2行)。看看我的答案來解決這個問題。 – Nestor 2009-10-29 15:54:30

+0

Msg 102,Level 15,State 1,Line 3 'InnerJoin'附近的語法不正確。 Msg 102,Level 15,State 1,Line 6 'b'附近語法不正確。 – user175084 2009-10-29 15:55:25

+0

加上這是我做的同樣的事情...它與我編輯的查詢相似.. – user175084 2009-10-29 15:56:25

0
SELECT MAX(files) as max_files, id, status, dept 
FROM table 
GROUP BY id 
+0

該團隊將需要有地位,部門也...但如果我這樣做,所有條目將被顯示...所以這不是正確的..感謝艱難 – user175084 2009-10-29 16:02:08

+0

爲什麼GROUP BY需要這些額外的列? – teabot 2009-10-29 16:24:37

0

我可能是過度簡化的問題,而是:

select top 5 * from SLAStat order by files desc; 
+0

這僅僅是一個例子......表中可能有很多條目.. – user175084 2009-10-29 15:58:19