mysql - 在同一列上连接同一个表两次,不同的值仅返回最近的行

标签 mysql sql join

我一直在尝试解决复杂 JOIN 的一小部分问题。

我们有一个“说明”表和一个“估计”表。在“估计”中,我们有多行用于给定指令的不同类型的估计。

说明表

id | address | status
1 | 27 TAYLOR ROAD, ALBION PARK NSW 2527 | InProgress

预估表

id | instruction_id | basis | basis_date | basis_value  
1 | 1 | ContractPrice | 2012-04-05 | 124000  
2 | 1 | CAMV | 2012-02-01 | 120000  
3 | 1 | CustomerEstimate | 2012-06-07 | 132000  
4 | 1 | ContractPrice | 2013-01-03 | 140000  
5 | 1 | CustomerEstimate | 2013-02-09 | 145000

我们想要的实际上是基于 instructions.id =estimates.instruction_id 和estimates.basis 对“estimates”进行 2 个“instructions”连接,用于 1) 最新的“CustomerEstimate”(将 basic_date 和 basic_value 别名为estimate_date 和estimate_value) 2) 最近的“ContractPrice”(再次将 basic_date 和 basic_value 别名为 contact_date 和contract_value)。

预期结果如下;

id | address | status | contract_price | contract_date | estimate_date | estimate_value  
1 | 27 TAYLOR ROAD, ALBION PARK NSW 2527 | InProgress | 2013-01-03 | 140000 | 2013-02-09 | 145000

我非常感谢 SQL 专家的帮助。

最佳答案

这应该有效:

SELECT *
FROM 
(
    SELECT i.id, i.address, i.status, 
        co.basis_value As contract_price, 
        co.basis_date  As contract_date,
        es.basis_date  As estimate_date, 
        es.basis_value As estimate_value,
        ROW_NUMBER() OVER(Partition By i.id Order By co.basis_date, es.basis_date) As RN
    FROM       instructions As i
    INNER JOIN estimates As co  ON (i.id = co.instruction_id AND co.basis = 'ContractPrice')
    INNER JOIN estimates As es  ON (i.id = es.instruction_id AND es.basis = 'CustomerEstimate')
) As a
WHERE RN = 1

关于mysql - 在同一列上连接同一个表两次,不同的值仅返回最近的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17260910/

相关文章:

php - 如何在phpMyAdmin中添加md5函数?

sql - 规范化一个表,从一个表到另一个表

sql - 存储 DateTime (UTC) 与存储 DateTimeOffset

mysql - 这些查询 JOIN 类型之间有什么区别,是否有任何警告?

r - 如何合并具有相同列名的多个数据框?

php - 如何查看准备好的语句的内容?

MySQL——不减少行集的 WHERE 子句

java.sql.Timestamp 到具有微秒精度的 String

mysql - 使用列名的动态行数据重建表的 SQL 查询

sql - 将字段从一个表更新到另一个,涉及 3 表连接