Sql 在多个条件下返回左外部联接中的最后一行

Sql 在多个条件下返回左外部联接中的最后一行,sql,postgresql,Sql,Postgresql,我正试图查询两个表。。我制作了以下示例表: ---------------TABLE1 (t1)------------ | id |type | date | | 1 | A | 2018-01-01 | | 2 | C | 2018-02-01 | | 3 | C | 2018-03-01 | | 4 | C | 2018-04-01 | | 5 | A | 2018-01-01 | | 6 | C | 2018-02-01 |

我正试图查询两个表。。我制作了以下示例表:

---------------TABLE1 (t1)------------
| id  |type |    date    |
|  1  |  A  | 2018-01-01 |
|  2  |  C  | 2018-02-01 |
|  3  |  C  | 2018-03-01 |
|  4  |  C  | 2018-04-01 |
|  5  |  A  | 2018-01-01 |
|  6  |  C  | 2018-02-01 |
|  7  |  C  | 2018-03-01 |
|  8  |  B  | 2018-04-01 |

---------------TABLE2 (t2)------------
| id  |    date    |amount|  created   |
|  1  | 2018-01-01 |  100 | 2017-10-01 |
|  1  | 2018-01-01 |  700 | 2017-12-01 |
|  1  | 2018-03-01 |  300 | 2018-01-01 |
|  2  | 2018-02-01 |  500 | 2017-12-01 |
|  2  | 2018-02-01 |   50 | 2017-10-01 |
|  3  | 2018-03-01 |  750 | 2018-02-01 |
|  3  | 2018-03-01 | 1000 | 2018-03-01 |
|  4  | 2018-04-01 |  200 | 2018-03-01 |
|  5  | 2018-04-01 |  300 | 2018-02-01 |
我希望:

---------------TABLE3------------
| id  |type |    date    |amount|  created   |
|  2  |  C  | 2018-02-01 |  500 | 2017-12-01 |
|  3  |  C  | 2018-03-01 | 1000 | 2018-03-01 |
|  4  |  C  | 2018-04-01 |  200 | 2018-03-01 |
|  6  |  C  | 2018-02-01 | NULL |    NULL    |
|  7  |  C  | 2018-03-01 | NULL |    NULL    |
我想要一个左连接(我认为在Postgres中这是一个默认的外部连接),条件是
t1.id=t2.id
t1.date=t2.date
,以及
t1.type='C'

我可以很容易地完成查询,但偶尔会在
t2
上收到多个匹配项。在这种情况下,我只想从
t2
中获取包含最近创建的
日期的行

最后,我希望表的行数与中的行数相同:
从t1中选择COUNT(*),其中type='C'

我在网站上查了许多其他问题,但无法找出如何在多个条件下解决这些问题。

您可以首先使用
DISTINCT ON
对t2进行过滤:

SELECT DISTINCT ON (id)
    *
FROM
    t2
ORDER BY id, date DESC
之后,您可以加入:

SELECT *
FROM t1
LEFT JOIN (
   -- subquery here
) t2
ON t1.id = t2.date
DISTINCT ON
给出有序组的第一条记录。这里您的组是
id
。如果按日期降序排列
id
组,则将最近的记录移到顶部

之后,您可以在
WHERE
子句中按
类型进行筛选。

您可以首先使用
DISTINCT ON
对t2进行过滤:

SELECT DISTINCT ON (id)
    *
FROM
    t2
ORDER BY id, date DESC
之后,您可以加入:

SELECT *
FROM t1
LEFT JOIN (
   -- subquery here
) t2
ON t1.id = t2.date
DISTINCT ON
给出有序组的第一条记录。这里您的组是
id
。如果按日期降序排列
id
组,则将最近的记录移到顶部


之后,您可以在
WHERE
子句中按
类型
进行筛选。

Postgres有一个非常好的扩展名为
distinct on
。这使得表达逻辑和为每个
id
返回一行变得非常简单:

select distinct on (t1.id), t1.*, t2.amount, t2.created
from table1 t1 left join
     table2 t2
     on t1.id = t2.id and t1.date = t2.date
where t1.type = 'C'
order by t1.id, t2.created desc

Postgres有一个非常好的扩展名为
distinct on
。这使得表达逻辑和为每个
id
返回一行变得非常简单:

select distinct on (t1.id), t1.*, t2.amount, t2.created
from table1 t1 left join
     table2 t2
     on t1.id = t2.id and t1.date = t2.date
where t1.type = 'C'
order by t1.id, t2.created desc

请显示您当前正在执行的sql,如您所述。然后,我可以修改它以执行您想要的操作。请显示您当前正在执行的sql,如您所述。然后我可以修改它做你想做的这正是我需要的。从不知道
DISTINCT ON
功能。。。干杯这正是我需要的。从不知道
DISTINCT ON
功能。。。干杯