2014-02-09 28 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