【发布时间】: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