【问题标题】:How to SELECT only one record from a group of related records in SQL?如何从 SQL 中的一组相关记录中只选择一条记录?
【发布时间】:2014-05-05 21:09:31
【问题描述】:

我想根据一个字段将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 中具有最高iteration 的行(在本例中为 3A-CSTC,00246-03)?

数据定义

TABLE_NAME COLUMN_NAME PRIMARY_KEY DATA_TYPE IS_NULLABLE
型号 ModelID TRUE char(2) 否
使 MakeID 为 TRUE char(4) NO
区域 RegionID TRUE char(5) 否
迭代 IterationId TRUE char(2) 否
ProductTable1 ProductID TRUE char(16) 否
ProductTable2 ProductID TRUE char(16) 否

所以 ProductId = ModelID + "-" + MakeID + "-" + RegionID + "IterationId"

我知道 HAVING 子句;但是,我不知道我可以使用什么表达方式。 我确实遇到过类似的情况,但different question。

【问题讨论】:

  • 向我们展示表定义。您声明它是一个复合键,但代码将其显示为 1 列。您使用的是哪个 DBMS?
  • 如果我正确使用复合键-模型、制造、区域和迭代是在不同表中定义的 4 个单独的列。在这些产品表中,它们合并为一列。它是一个 RDBMS,使用 Microsoft SQL Server。
  • 我没有说你做错了什么。但再次:向我们展示表格的定义。我们无法理解您所说的“组合”是什么意思。
  • 在编辑中添加了定义

标签: sql sql-server group-by having


【解决方案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 保持一致的长度,并且您可以指望迭代不超过两位数。

【讨论】:

  • 是的,先生,您是对的。我使用 LEFT() 来进行 GROUP BY,但我在示例代码中忽略了它。你知道我怎样才能从该组中只返回 1 行吗?
  • 无效的sql,但举个例子:GROUP BY LEFT(pt1.ProductID,13) WHERE pt1.Iteration 是这个组的最大数。
【解决方案2】:

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

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

【讨论】:

  • 我想从 ProductsTable1 返回 1 行。希望我添加的数据定义可以解决您的第二个问题。好吧,如果您在分组时无法从数据库中选择一行,我想您已经回答了我的问题。感谢您的额外建议。
  • 是的,当您进行分组时,您会收到一条错误消息,指出该字段不在聚合函数中......所以类似:select blah, blah1 from table groupby blah 将不起作用,因为 blah1 不能只是被选中。解决此问题的最佳方法是在子选择连接中进行分组,并确保选择任何使每一行唯一的特定 id。然后使用该 ID 将其连接回原始表,然后您可以选择所需的列。
猜你喜欢
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多