2014-02-09 59 views
0

選擇最高的列值,我有以下表格:SQL查詢 - 爲表

ProductID, GroupID, Description 
1   100  Blah blah 
2   200  Blah blah 
3   100  Blah blah 
4   200  Blah blah 
5   200  Blah blah 
6   100  Blah blah 
7   300  Blah blah 
9   300  Blah blah 
10   100  Blah blah 

我需要運行一個查詢,獲取數據,該表使得每個羣ID檢索只有一次,和上幾乎選擇了ProductID。示例如下所示

ProductID, GroupID, Description 
10   100  Blah blah 
5   200  Blah blah 
9   300  Blah blah 

有關最佳方法的任何想法嗎?目標是每次運行此查詢時,它總是會獲取每個特定GroupID的最新ProductID。本表中有很多字段,但我正在簡化它到這個例子,這基本上說明了我試圖解決的主要問題

謝謝!

+0

結果請參考下面的回答,首先我失落的時候投bcoz我上無法理解你的答案question.Now編輯和意義 –

回答

1

你可以試試這個(未測試):

SELECT t.ProductID, t.GroupID, t.Description 
FROM MyTableName t 
    INNER JOIN 
     (SELECT MAX(ProductID) As ProductID, GroupID 
     FROM MyTableName 
     GROUP BY GroupID) as maxPerGroup 
    ON maxPerGroup.ProductID = t.ProductID 

SQL fiddle demo

+0

解釋downvote。查詢在我對問題的理解中工作正常。 – har07

+0

是的,我測試過了。它工作正常。 如果有人被低估了它。那就不好。 要降壓任何事情,你必須有一個有效的理由。 –

-1

對不起首先我水溼明白你的問題,所以我倒投票。以下是編輯過的正確且經過測試的查詢。

您的記錄:

select * from dbo.[Products] 

enter image description here

顯示鮮明的羣ID與頂級的ProductID

;with cteProducts(ProductID , GroupID) AS 
(
select max(ProductID) ProductID , GroupID 
FROM dbo.Products od 
Group by GroupID 
) 
SELECT p1.ProductID,p1.GroupID,p1.[Description] from Products p1 
INNER JOIN cteProducts p2 on p1.ProductID=p2.ProductID 
order by p1.ProductID Desc 

你需要的結果在此執行:

enter image description here

1

您將要使用OVER子句通過GroupId對錶進行分區。這將爲您提供一個包含兩列的表,即productId和一個rowNum。對於每個GroupID中最高的ProductID,rowNum將爲1。接下來,您只需內部連接到該表,並獲取有1. OVER子句更多信息一的rowNum ProductIDs可以found here

SELECT yt1.* 
FROM yourTable yt1 
INNER JOIN ( 
    SELECT ROW_NUMBER() OVER(PARTITION BY GroupID ORDER BY ProductId DESC) as rowNum 
    , ProductID FROM yourTable 
    )yt2 
ON yt1.ProductID = yt2.ProductID 
WHERE yt2.rowNum = 1 
-1

在PostgreSQL,這個工程。請在SQL Server查詢 -

select t.productid, t.groupid, t.description from t, (select max(productid) mp , groupid from t group by groupid) x where t.productid=x.mp; 
; 
productid | groupid | description 
-----------+---------+------------- 
     5 |  200 | BLAH BLAH 
     9 |  300 | BLAH BLAH 
     10 |  100 | BLAH BLAH 
(3 rows) 
+0

爲什麼我投了票? – Jayadevan

0

嘗試此查詢

SELECT * FROM產品;

+-----------+---------+-------------+ 
| productId | groupId | description | 
+-----------+---------+-------------+ 
|   1 |  100 | hello  | 
|   2 |  200 | hello  | 
|   3 |  100 | hello  | 
|   4 |  200 | hello  | 
|   5 |  200 | hello  | 
|   6 |  100 | hello  | 
|   7 |  300 | hello  | 
|   8 |  300 | hello  | 
|   9 |  100 | hello  | 
|  10 |  200 | hello  | 
+-----------+---------+-------------+ 

SELECT * FROM產品,其中的productId在(選擇MAX(的productId)從產品組由的groupId)爲了通過的groupId ASC;

+-----------+---------+-------------+ 
| productId | groupId | description | 
+-----------+---------+-------------+ 
|   9 |  100 | hello  | 
|  10 |  200 | hello  | 
|   8 |  300 | hello  | 
+-----------+---------+-------------+ 
1

這樣的任務,這一次,我總是喜歡使用Ranking

SELECT ProductID, GroupID, Description FROM 
(
    SELECT 
     t.ProductID 
     ,t.GroupID 
     ,t.Description  
     ,RANK() OVER (PARTITION BY t.GroupID ORDER BY t.ProductID DESC) [Rank] 
    FROM MyTableName t 

) RawData 
WHERE RANK = 1 

一般來說,內部查詢只是給每一行行列的背景下,它是GroupID
(這是由RANK() OVER (PARTITION BY t.GroupID ORDER BY t.ProductID DESC完成)。

包裝查詢僅用於篩選排名爲1的行,即productID在特定GroupID的上下文中最高。

,您可以在此Fiddle demo