0

我正在使用 LTREE 存储员工“报告链”的数据层次结构,并且只想选择具有最深层次结构的行。

例子:

| id  (serial) | EmployeeName (varchar) | ReportingChain (LTree) |
|:---|:-------------|:---------------|
| 1 | Frank|org1.region_1.office_a |
| 2 | Frank|org1.region_1.office_a.sales |
| 3 | Frank|org1.region_1.office_a.sales.direct_sales |
| 4 | Frank|org1.region_1.office_b.marketing |

'Frank' 在 office_a 和 office_b 工作。他在 office_a 中向“直销”报告,在 office_b 中向“营销”报告。

我只想显示他在每个办公室报告的“最深”链。所以预期的输出是:

| id  (serial) | EmployeeName (varchar) | ReportingChain (LTree) |
|:---|:-------------|:---------------|
| 3 | Frank|org1.region_1.office_a.sales.direct_sales |
| 4 | Frank|org1.region_1.office_b.marketing |

(没有选择第 1 行和第 2 行,因为它们已经被该“报告链”中最深的层次结构所覆盖。

我相信我应该使用类似的东西

select max(nlevel(ReportingChain))

但无法完全弄清楚。

我将不胜感激任何指导。

我用来测试的架构:

drop table if exists TestData;

CREATE TABLE IF NOT EXISTS TestData (
  id serial,
  EmployeeName varchar(50) NOT NULL,
  Department varchar(50) NOT NULL,
  ReportingChain ltree
);

INSERT INTO TestData (EmployeeName, Department, ReportingChain) VALUES
  ('Frank','Sales', 'org1.region_1.office_a'),
  ('Frank','Sales', 'org1.region_1.office_a.sales'),
  ('Frank','Sales', 'org1.region_1.office_a.sales.direct_sales'),
  ('Frank','Sales', 'org1.region_1.office_b.marketing');
  
CREATE INDEX path_gist_idx ON TestData USING GIST (ReportingChain);
CREATE INDEX path_idx ON TestData USING BTREE (ReportingChain);  
4

0 回答 0