我有下表:
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。这个表中有很多字段,但是我将它简化为这个例子,它基本上说明了我试图解决的主要问题
谢谢!
答案 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
答案 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]
使用最高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
您在此处执行的所需结果:
答案 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)