Advertisement
Doomer3D

Объединение нескольких групп данных через FULL JOIN

Oct 12th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. with mz(idx,name,a,b,c) as (
  2.     select 1,'Балашиха', 1, 2, 3
  3.     union all select 2,'Балашиха', 4, 5, 6
  4.     union all select 3,'Калач', 7, 7, 7
  5. ),
  6. mo(idx,name,d,e,f) as (
  7.     select 1,'Балашиха', 1, 2, 3
  8.     union all select 2,'Реутов', 4, 5, 6
  9.     union all select 3,'Балашиха', 7, 8, 9
  10. ),
  11. mt(idx,name,g,h) as (
  12.     select 1,'Балашиха', 1, 2, 3
  13.     union all select 2,'Реутов', 4, 5, 6
  14.     union all select 3,'Химки', 7, 8, 9
  15. ),
  16. mz_ranked as (
  17.     select row_number() over (partition by name) as rn,
  18.            *
  19.       from mz
  20. ),
  21. mo_ranked as (
  22.     select row_number() over (partition by name) as rn,
  23.            *
  24.       from mo
  25. ),
  26. mt_ranked as (
  27.     select row_number() over (partition by name) as rn,
  28.            *
  29.       from mt
  30. ),
  31. mz_mo as (
  32.     select row_number() over (partition by coalesce(mz.name, mo.name)) as rn,
  33.            row_number() over () as idx,
  34.            coalesce(mz.name, mo.name) as name,
  35.            mz.a,
  36.            mz.b,
  37.            mz.c,
  38.            mo.d,
  39.            mo.e,
  40.            mo.f
  41.       from mz_ranked as mz
  42.       full join mo_ranked mo on mo.name = mz.name and mo.rn = mz.rn
  43. ),
  44. mz_mo_mt as (
  45.     select row_number() over (partition by coalesce(p.name, mt.name)) as rn,
  46.            row_number() over () as idx,
  47.            coalesce(p.name, mt.name) as name,
  48.            p.a,
  49.            p.b,
  50.            p.c,
  51.            p.d,
  52.            p.e,
  53.            p.f,
  54.            mt.g,
  55.            mt.h
  56.       from mz_mo p
  57.       full join mt_ranked mt on mt.name = p.name and mt.rn = p.rn
  58. )
  59. select *
  60.   from mz_mo_mt
  61. ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement