【问题标题】:Select the first row of a LEFT JOIN选择 LEFT JOIN 的第一行
【发布时间】:2020-08-02 17:27:12
【问题描述】:

我正在尝试进行左连接。但我只想要连接表的第一行。

当我这样做时:

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 中使用此请求。

【问题讨论】:

    标签: sql postgresql klipfolio


    【解决方案1】:

    如果您只想要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
    

    【讨论】:

      猜你喜欢
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      相关资源
      最近更新 更多