2

ツリー構造のように構築された地理的構造を説明するテーブルがあります。列1は「国」、列2には「地域1」と呼ばれる最大の行政区域が含まれ、「地域2」列には地域1の子が含まれます。

したがって、この

                     r
     /               |               \
     1               2               3
/    |     \    /    |     \    /    |     \
11   12    13   21   22    23   31   32     33

異なる組み合わせごとに次のように表されます。

cntry|  r1  |  r2
------------------
  r  |  1   |  11
  r  |  1   |  12
  r  |  1   |  13
  r  |  2   |  21
  r  |  2   |  22
  r  |  2   |  23
  r  |  3   |  31
  r  |  3   |  32
  r  |  3   |  33

さらに、各リーフ ノードには追加情報が含まれており、複数の行にまたがることがあります。郵便番号など。したがって、テーブルは実際には次のようになります。

cntry| r1   |  r2  |  zip |
--------------------------|
  r  |  1   |  11  |  a   |
  r  |  1   |  11  |  aa  |
  r  |  1   |  11  |  aaa |
  r  |  1   |  11  |  aaaa|
  r  |  1   |  12  |  b   |
  r  |  1   |  13  |  c   |
  r  |  1   |  13  |  cc  |
  r  |  1   |  13  |  ccc |
  r  |  2   |  21  |  d   |
  r  |  2   |  22  |  e   |
  r  |  2   |  22  |  ee  |
  r  |  2   |  23  |  f   |
  r  |  3   |  31  |  g   |
  r  |  3   |  31  |  gg  |
  r  |  3   |  31  |  ggg |
  r  |  3   |  32  |  h   |
  r  |  3   |  33  |  i   |

現在、実際のテーブルには約 200 万行が含まれており、場所名の列には多くのテキストが含まれています。郵便番号だけが新しい情報である追加の行には、多くの重複した情報があります。帯域幅を占有し、低速です。

cntry、r1、r2を個別に順序付けて選択するクエリを作成できますが、zip行は各個別の行に続きnull、他の列にはありますか? したがって、選択の結果は次のようになります。

cntry| r1   |  r2  |  zip |
--------------------------|
  r  |  1   |  11  |  a   |
 NULL| NULL | NULL |  aa  |
 NULL| NULL | NULL |  aaa |
 NULL| NULL | NULL |  aaaa|
  r  |  1   |  12  |  b   |
  r  |  1   |  13  |  c   |
 NULL| NULL | NULL |  cc  |
 NULL| NULL | NULL |  ccc |
  r  |  2   |  21  |  d   |
  r  |  2   |  22  |  e   |
 NULL| NULL | NULL |  ee  |
  r  |  2   |  23  |  f   |
  r  |  3   |  31  |  g   |
 NULL| NULL | NULL |  gg  |
 NULL| NULL | NULL |  ggg |
  r  |  3   |  32  |  h   |
  r  |  3   |  33  |  i   |
4

1 に答える 1

1
with cte as (
   select *, row_number() over(partition by cntry, r1, r2 order by zip) as row_num
   from tbl
)
select
    case when c.row_num = 1 then cntry end as cntry,
    case when c.row_num = 1 then r1 end as r1,
    case when c.row_num = 1 then r2 end as r2,
    c.zip
from cte as c
order by c.r1, c.r2, row_num

SQL フィドルのデモ

于 2013-08-19T17:33:55.627 に答える