如何从SQL中的一组相关记录中仅选择一条记录?

时间:2014-05-05 21:09:31

标签: sql sql-server group-by having

我想基于一个字段将GROUP行放在一起,然后SELECT只有每个字段中的一个字段。

假设我有一个 ProductID ,这是一个基于4个字段 {model,make,region,iteration} compound key密钥。 ProductID 始终采用00-0000-00000-00格式,迭代是一个按顺序递增的整数。我可以使用以下SQL将模型,品牌和区域相同的所有产品组合在一起:

SELECT pt1.ProductID
FROM ProductsTable pt1
    INNER JOIN ProductsTable2 pt2 ON pt1.ProductID = pt2.ProductID
GROUP BY LEFT(pt1.ProductID, 13)

这将有一个GROUP类似:

3A-CSTC,00246-01
3A-CSTC,00246-02
3A-CSTC,00246-03

如何仅返回 ProductID 中具有最高迭代次数的行(在本例中为3A-CSTC,00246-03)?

  

数据定义

TABLE_NAME     COLUMN_NAME  PRIMARY_KEY   DATA_TYPE   IS_NULLABLE
Models         ModelID      TRUE          char(2)     NO
Makes          MakeID       TRUE          char(4)     NO
Regions        RegionID     TRUE          char(5)     NO
Iterations     IterationId  TRUE          char(2)     NO
ProductTable1  ProductID    TRUE          char(16)    NO
ProductTable2  ProductID    TRUE          char(16)    NO

所以 ProductId = ModelID +“ - ”+ MakeID +“ - ”+ RegionID +“IterationId”

我知道HAVING条款;但是,我不知道我可以用什么表达。 我确实遇到了类似的问题,但different question

2 个答案:

答案 0 :(得分:1)

你应该使用聚合函数GROUP BY ProductID SELECT的子字符串:

SELECT MAX(pt1.ProductID)
FROM ProductsTable pt1
    INNER JOIN ProductsTable2 pt2 ON pt1.ProductID = pt2.ProductID
GROUP BY LEFT(pt1.ProductID,13)

假设 ProductID 保持一致的长度,您可以指望迭代不超过两位数。

答案 1 :(得分:0)

我不完全理解您处理的数据场景,当您说要返回一行时,您希望从哪个表中行,以及哪个表导致多个记录?在分组时,无法从数据库中选择一个简单的行。您必须汇总您要选择的所有内容。听起来你需要在其中一个表上利用主键并进行某种类型的子选择。

select * from ProductsTable pt1
join (select left(pt1.ProductID, 13) as prodid, max(pt2.primarykey) as primarykey from ProductsTable pt2 group by left(pt1.ProductID, 13)) as a on a.primarykey=pt1.primarykey