SQL查询 - 选择表的最高列值

时间:2014-02-09 04:02:30

标签: sql sql-server sql-server-2008 select join

我有下表:

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

我需要运行一个查询来获取此表的数据,以便只检索一次EACH GroupID,并选择最顶层的ProductID。示例如下所示

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

对此最佳方法的想法?目标是每次运行此查询时,它始终获取每个特定GroupID的最新ProductID。这个表中有很多字段,但是我将它简化为这个例子,它基本上说明了我试图解决的主要问题

谢谢!

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您将要使用OVER子句按GroupId对表进行分区。这将为您提供一个包含两列的表,productId和rowNum。对于每个GroupID中的最高ProductID,rowNum将为1。接下来,您只需内部连接到该表并获取rowNum为1的ProductID。有关OVER子句的更多信息可以是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

答案 2 :(得分: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

中查看结果

答案 3 :(得分:0)

尝试此查询

从产品中选择*;

+-----------+---------+-------------+
| 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       |
+-----------+---------+-------------+

从productId中的产品中选择*(从groupId的产品组中选择MAX(productId))按groupId ASC排序;

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

答案 4 :(得分:-1)

抱歉,首先我无法理解你的问题,所以我失败了。以下是经过编辑的正确且经过测试的查询。

你的记录:

select * from dbo.[Products]

enter image description here

使用最高ProductID

显示不同的GroupID
;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

答案 5 :(得分:-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)