2013-08-19 25 views
2

我有一个表格描述了一个地理结构,这是一个树状结构,其中column1是'国家',第2列包含最大的行政所谓的 'REGION1',然后 '区域2' 列区域包含REGION1等孩子从一个树结构表,如何选择分支,然后分区更多信息为每个分支

所以这

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

是represesented像这样为每个不同的组合:

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 | 

现在,真正的表包含近两百万行,有很多在列文的地名。这是附加行中的许多重复信息,其中只有邮政编码是新信息。它占用带宽,速度很慢。

是否有可能进行查询,以明确和有序地选择cntry,r1,r2,但在其他列中的每个不同行后面跟着zip行?所以选择的结果是这样的:

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 | 

回答

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 fiddle demo

相关问题