【发布时间】:2016-07-21 01:00:44
【问题描述】:
我有一个存储合同行的表格。每个合同行都有自己的唯一 ID,它也有其父合同的 ID。示例:
+-------------+---------+
| contract_id | line_id |
+-------------+---------+
| 1111 | 100 |
| 1111 | 101 |
| 1111 | 102 |
+-------------+---------+
我有另一个表来存储合同行的历史更改。例如,每次更改合同行上的单位数时,都会在表中添加一个新行。示例:
+-------------+---------+--------------+-------+
| contract_id | line_id | date_changed | units |
+-------------+---------+--------------+-------+
| 1111 | 100 | 2016-01-01 | 1 |
| 1111 | 100 | 2016-02-01 | 2 |
| 1111 | 100 | 2016-03-01 | 3 |
+-------------+---------+--------------+-------+
如您所见,属于 ID 为 1111 的合同的 ID 为 100 的合同行已在 3 个月内被编辑了 3 次。当前值为 3 个单位。
我正在对合同行表运行查询以选择所有数据。我想加入历史数据表并为每个合同行选择最近的行并在我的结果中显示单位。我该怎么做?
预期结果(101 和 102 也会有单一结果):
+-------------+---------+-------+
| contract_id | line_id | units |
+-------------+---------+-------+
| 1111 | 100 | 3 |
+-------------+---------+-------+
我用左连接尝试了下面的查询,但它返回 3 行而不是 1 行。
查询:
SELECT *, T1.units
FROM contract_lines
LEFT JOIN (
SELECT contract_id, line_id, units, MAX(date_changed) AS maxdate
FROM contract_history
GROUP BY contract_id, line_id, units) AS T1
ON contract_lines.contract_id = T1.contract_id
AND contract_lines.line_id = T1.line_id
实际结果:
+-------------+---------+-------+
| contract_id | line_id | units |
+-------------+---------+-------+
| 1111 | 100 | 1 |
| 1111 | 100 | 2 |
| 1111 | 100 | 3 |
+-------------+---------+-------+
【问题讨论】:
标签: sql sql-server sql-server-2012