【问题标题】:INNER JOIN 3 tables with GROUP BY and Aggregate Function具有 GROUP BY 和聚合函数的 INNER JOIN 3 个表
【发布时间】:2019-06-13 03:37:25
【问题描述】:

我有三个表,我正在尝试使用聚合函数和分组依据进行内部连接。我的两个时间表都有一个外键,它引用了空间表的 id。这是我的数据的样子:

Spaces  
id  address
1   'Address 1, city, state, zip'    
2   'Address 2, city, state, zip'  
3   'Address 3, city, state, zip'  
4   'Address 4, city, state, zip'  
5   'Address 5, city, state, zip'  

Times1  
id1 spaces_id  start   end
1   1          '10am'  '1pm'  
2   1          '11am'  '7pm'  
3   1          '1am'   '1pm'  
4   2          '10am'  '9pm'  
5   2          '8am'   '1pm'  

Times2  
id2 spaces_id  start   end  
1   1          '10am'  '1pm'  
2   1          '11am'  '7pm'  
3   1          '1am'   '1pm'  
4   2          '10am'  '9pm'  
5   2          '8am'   '1pm'  

我希望我的输出数据看起来像这样(将两个表中的时间组合成一个带有 start 和 end 属性的时间数组):

Combined
id  address                         times
1   'Address 1, city, state, zip'   [{start: '10am', end: '1pm'}, {start: '11am', end: '7pm'}, ...]
2   'Address 2, city, state, zip'   [{start: '10am', end: '9pm'}, {start: '8am', end: '1pm'}, ...]
3   'Address 3, city, state, zip'   [...]
4   'Address 4, city, state, zip'   [...]
5   'Address 5, city, state, zip'   [...] 

我已通过以下查询成功地将这些数据与空间表和 ONE 时间表相结合:

SELECT s.*, JSON_STRIP_NULLS(JSON_AGG(JSON_BUILD_OBJECT('start', t.start, 'end', t.end))) 
AS times 
FROM spaces s 
LEFT OUTER JOIN times t 
ON s.id = t.space_id 
GROUP BY s.id

【问题讨论】:

  • @TaylerBantle,我的回答有帮助吗?
  • @fphilipe 是的,非常感谢!

标签: database postgresql inner-join aggregate-functions


【解决方案1】:

您的结构与您编写的查询之间存在一些不一致之处,因此我做了一些假设。因此,您可能需要调整查询。

SELECT
    s.id,
    s.address,
    COALESCE(json_agg(d.json) filter (WHERE d.json IS NOT NULL), '[]')
FROM spaces s
LEFT JOIN (
    SELECT
        spaces_id,
        json_build_object('start', start, 'end', "end") AS json
    FROM (
        SELECT * FROM times1
        UNION ALL
        SELECT * FROM times2
    ) t
) d ON d.spaces_id = s.id
GROUP BY s.id, s.address;

解释:

在第一步中,我们通过合并两个时间表来构造一个数据集d,这样我们就可以得到一个空间 id 和所需的 JSON 对象。

然后我们选择空格并在数据集d上方左连接。对于d 中没有任何数据的空间,我们不想json_agg,这将导致[null]。相反,我们将它们过滤掉,这将产生null。为了防止 null 我们 COALESCE 到一个空的 JSON 数组。

【讨论】:

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