postgresql 如何联接同一表的两列并计算行数

xytpbqjk  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(136)

需要PostgreSQL中以下场景的帮助。
我需要匹配表1中的A列和B列以及B列和A列,并根据A列和B列计算电线的数量。
表一
| 金属丝 |器械来源(A列)|器械至(B列)|级别|
| - -|- -|- -|- -|
| 导丝1|设备1|设备2|第一级|
| 导丝2|设备1|设备2|第一级|
| 3号线|设备2|设备1|第一级|
输出应类似于
| 导线数量|导丝|设备来自|设备至|级别|
| - -|- -|- -|- -|- -|
| 三个|配缐1、配缐2、配缐3 3|设备1|设备2|第一级|

d4so4syb

d4so4syb1#

为了简洁地解决您的问题,我将device_fromdevice_to列转换为数字(整数)

CREATE TABLE wiretable ( 
     wire text,
     device_from integer,
     device_to integer,
     level text);

INSERT INTO wiretable
         (wire, device_from, device_to, level)      
   VALUES('Wire 1', 1, 2, 'level 1'),
         ('Wire 2', 1, 2, 'level 1'), 
         ('Wire 3', 2, 1, 'level 1');

你需要一种比较设备1和设备2的方法,使1,22,1相同。我能想到的唯一方法是使用数组和排序。但是要进行数组排序,你必须安装intarray扩展(CREATE EXTENSION intarray;)或使用一些技巧。请参阅this question了解如何对数组排序和/或安装扩展。
基本上你要对两列执行GROUP BY,我在文档中找不到类似的东西,所以我把两列放在一个数组中,然后用GROUP BY数组,我必须分两步来完成。

SELECT count(*), string_agg(wire, ', '),
         sort(array[device_from, device_to]) as combo, 
         level 
    FROM wiretable 
GROUP BY combo, level;

| 计数器|字符串聚集|组合|水准仪|
| - -|- -|- -|- -|
| 三个|导线1、导线2、导线3| {1、2}|第一级|
这看起来很不错,但现在我们必须将combo拆分为两列。

WITH foo AS (SELECT count(*), string_agg(wire, ', '),
                    sort(array[device_from, device_to]) as combo,  
                    level
               FROM wiretable
           GROUP BY combo, level)

SELECT foo.count, foo.string_agg as wires, 
       foo.combo[1] as "Device From",
       foo.combo[2] as "Device To", 
       foo.level
  FROM foo

其给出了
| 计数器|导线|设备自|设备至|水准仪|
| - -|- -|- -|- -|- -|
| 三个|导线1、导线2、导线3|一个|2个|第一级|

相关问题