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
功能。。。干杯