如何将相关组保持在一起?

时间:2018-12-25 13:08:22

标签: postgresql grouping

DB fiddle DB fiddle(已更新)

我注意1-2; 3-4例。请注意,来自config_id组的所有行仍与xgroup的所有行一起 enter image description here

详细的任务描述: 我有一些资源的订单详细信息。对于每个有序资源,应该分配资源。资源可能属于彼此,并且属于某个组。考虑虚拟机VM具有:RAM,CPU,HDD。

当前,订单和分配的资源之间的关系已断开。我尝试编写查询来分析什么是没有分配资源的有序的东西,什么是没有秩序分配的东西。

CREATE TABLE order_detail (
  id SERIAL,
  order_id INTEGER,
  resource_type_id INTEGER,
  allocated_resource_id INTEGER,
  amount INTEGER
)

CREATE TABLE allocated_resource (
  id SERIAL,
  group_id INTEGER,
  resource_type_id INTEGER,
  resource_uuid UUID,
)

这很容易做到:

select * from order_detail od
where od.allocated_resource_id IS NULL

SELECT * FROM allocated_resource ar
WHERE NOT EXISTS ( SELECT 1 FROM order_detail od where od.allocated_resource_id = ar.id) 

但是我需要找到分配该资源的订单。或为该订单分配哪个资源。或哪个订单绑定到分配的资源。

数据示例:

id | order_id | allocated_resource_id | resource_type_id
--------------------------------------------------------
41 | 1        | 1                     | 70
42 | 1        |                       | 71
43 | 1        |                       | 73
44 | 2        |                       | 70
45 | 2        | 5                     | 71

id | group_id | resource_type_id
--------------------------------
1  | 1        | 70
2  | 1        | 71
3  | 1        | 72
4  | 2        | 70
5  | 2        | 71
6  | 2        | 73

我想在这里得到:

id | order_id | allocated_resource_id | resource_type_id | ar.id | ar.group_id | ar.resource_type_id
----------------------------------------------------------------------------------------------------
41 | 1        | 1                     | 70               | 1     | 1           | 70
42 | 1        |                       | 71               |
43 | 1        |                       | 73               |
   |          |                       |                  | 1     | 1           | 71
   |          |                       |                  | 1     | 1           | 72
44 | 2        |                       | 70               |
45 | 2        | 5                     | 71               | 5     | 1           | 71
   |          |                       |                  | 4     | 1           | 70
   |          |                       |                  | 6     | 1           | 73

不幸的是,order by ar.idorder by od.id会将未绑定的订单明细/分配的资源移到底部。我想像上面的示例一样将订单详细信息/分配的资源保持在一起。

要解决任务,我首先选择所有可用的相关组:

od_ar_group AS (
  SELECT 
    od.order_id, ar.group_id,
    cast( od.order_id AS TEXT ) || '-' || cast( ar.group_id AS TEXT ) AS odar
  FROM order_detail od
  FULL JOIN allocated_resource ar ON ar.id = od.allocated_resource_id
  WHERE od.order_id IS NOT NULL AND ar.group_id IS NOT NULL 
  GROUP BY od.order_id, ar.group_id
)

然后我将组信息附加到两个表:

SELECT od.*, odar.odar
FROM order_detail od
LEFT JOIN od_ar_group odar ON odar.order_id = od.order_id 

SELECT ar.*, odar.odar
FROM allocated_resource ar
LEFT JOIN od_ar_group odar ON odar.parent_id = ar.parent_id

最后,我可以加入这些组并在其中进行排序。因此,未绑定订单明细/已分配资源位于组内,而不是表的底部:

SELECT 
  CASE WHEN od.odar IS NOT NULL THEN od.odar ELSE ar.odar END AS odar,
  od.*, ar.*
FROM od_grouped
FULL JOIN ar_grouped ar ON ar.odar = od.odar
    AND ar.id = od.allocated_resource_id
ORDER BY odar, CASE WHEN od.id IS NULL THEN 1 WHEN ar.id IS NULL THEN 2 ELSE 0 END, od.id NULLS LAST

是否有更简单的方法将相关行保留在组中?

0 个答案:

没有答案