具有唯一行集的左外部联接

bpzcxfmw  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(318)

我有一张有两个字段的表

SETID   SEL_GROUP
KICAE   AA_01DBA
KICAE   AA_02DHM
KICAE   AA_03DML
KICAE   AA_03DMO
KICAE   AA_05CAO
KICAE   AA_05CGA

另一个表有两个字段

SETID  COURSELIST
KICAE   110011000
KICAE   110011200
KICAE   110011500
KICAE   110011530
KICAE   110021000
KICAE   110021200
KICAE   110021500
KICAE   110021530

................

在表2中,课程列表的最后4个字符依次从位置3到位置5重复。
我希望输出是

SETID  SEL_GROUP   COURSE_LIST
KICAE   AA_01DBA   110011000
KICAE   AA_01DBA   110011200
KICAE   AA_01DBA   110011500
KICAE   AA_01DBA   110011530
KICAE   AA_02DHM   110021000    ---------The Sequence Changes When the SEL_GROUP Changes
KICAE   AA_02DHM   110021200
KICAE   AA_02DHM   110021500
KICAE   AA_02DHM   110021530
7uhlpewt

7uhlpewt1#

你好像想要这样的东西:

select t2.setid, t1.sel_group, t2.courselist
from (select t2.*,
             dense_rank() over (partition by setid order by substr(courselist, 1, 5)) as seqnum
      from table2 t2
     ) t2 join
     (select t1.*, row_number() over (partition by setid order by sel_group) as seqnum
      from table1 t1
     ) t1
     on t2.seqnum = t1.seqnum and t2.setid = t1.setid;

这将枚举中的组 table2 基于课程列表中的前五个字符。然后它枚举 table1 用它来连接。

0qx6xfy6

0qx6xfy62#

可以使用窗口函数:

select a.setid, a.sel_group, b.courselist
from (
    select a.*, row_number() over(partition by setid order by sel_group) rn
    from a
) a
inner join (
    select b.*, dense_rank() over(partition by setid order by substr(course_list, 1, 6)) rn
    from b
) b on a.setid = b.setid and a.rn = b.rn

第一个子查询按顺序排列具有相同属性的记录 setid . 第二个子查询将相同的秩分配给具有相同秩的记录 setid 这首歌的前6个字是谁的 course_list 都是一样的。那你就可以了 join 这两个结果集可以得到您想要的结果。
db小提琴演示:

SETID | SEL_GROUP | COURSELIST
:---- | :-------- | ---------:
KICAE | AA_01DBA  |  110011000
KICAE | AA_01DBA  |  110011200
KICAE | AA_01DBA  |  110011500
KICAE | AA_01DBA  |  110011530
KICAE | AA_02DHM  |  110021000
KICAE | AA_02DHM  |  110021200
KICAE | AA_02DHM  |  110021500
KICAE | AA_02DHM  |  110021530

相关问题