Select LEFT JOIN 的第一行
Select the first row of a LEFT JOIN
我正在尝试进行左连接。但我只想要加入的第一行 table.
当我这样做时:
SELECT DISTINCT
c.reference
FROM contracts as c
输出:7400行
但是当我尝试进行左连接时,我有很多重复项。
我已经尝试只获取第一行,但它不起作用。这是我的代码:
SELECT DISTINCT
c.reference,
contract_premiums.start_date
FROM contracts as c
LEFT OUTER JOIN contract_premiums ON contract_premiums.contract_id=(
SELECT contract_id FROM contract_premiums
WHERE contract_premiums.contract_id = c.id
ORDER BY contract_premiums.created_at ASC
LIMIT 1)
输出:11500行
注意 Postgresql
中的数据库,我在 klipfolio
中使用此请求。
如果您只想要每个 reference
的最新 start_date
,您可以使用聚合:
select c.reference, max(cp.start_date) max_start_date
from contracts c
left join contracts_premiums cp on cp.contract_id = c.id
group by c.reference
这保证您每 reference
.
只会得到一行
如果您想要 contracts_premiums
中的更多列,或者如果您想要按 start_date
以外的列排序(可能您想要 created_at
),那么另一个选项是distinct on
:
select distinct on (c.reference) c.reference, cp.start_date, cp.created_at
from contracts c
left join contracts_premiums cp on cp.contract_id = c.cid
order by c.reference, cp.created_at desc
我正在尝试进行左连接。但我只想要加入的第一行 table.
当我这样做时:
SELECT DISTINCT
c.reference
FROM contracts as c
输出:7400行
但是当我尝试进行左连接时,我有很多重复项。
我已经尝试只获取第一行,但它不起作用。这是我的代码:
SELECT DISTINCT
c.reference,
contract_premiums.start_date
FROM contracts as c
LEFT OUTER JOIN contract_premiums ON contract_premiums.contract_id=(
SELECT contract_id FROM contract_premiums
WHERE contract_premiums.contract_id = c.id
ORDER BY contract_premiums.created_at ASC
LIMIT 1)
输出:11500行
注意 Postgresql
中的数据库,我在 klipfolio
中使用此请求。
如果您只想要每个 reference
的最新 start_date
,您可以使用聚合:
select c.reference, max(cp.start_date) max_start_date
from contracts c
left join contracts_premiums cp on cp.contract_id = c.id
group by c.reference
这保证您每 reference
.
如果您想要 contracts_premiums
中的更多列,或者如果您想要按 start_date
以外的列排序(可能您想要 created_at
),那么另一个选项是distinct on
:
select distinct on (c.reference) c.reference, cp.start_date, cp.created_at
from contracts c
left join contracts_premiums cp on cp.contract_id = c.cid
order by c.reference, cp.created_at desc