我正在使用 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);