2

我有一个描述地理结构的表,它像树形结构一样构建,其中 column1 是“国家”,column2 包含称为“region1”的最大行政区域,然后“region2”列包含 region1 的子级等。

所以这

                     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 回答