Oracle分区依据

时间:2018-02-21 05:09:08

标签: sql oracle10g window-functions

我一直在尝试通过sql中的函数来理解over partition,因为我已经根据一些参数编写了一个查询,我为这个参数获取了相同id的多个记录。他们查询我写的是怀疑地获取一个人的详细信息,如他的名字,dob,地址等等。在这种情况下,我得到多个记录,因为用户的地址多于一个。目前我已经使用了首选地址,但可能会出现用户没有任何首选地址,因此即使匹配到该地址,我也无法获得该人的详细信息我给出的参数。所以我想我必须使用这个所谓的over partition,这样我每个用户得到1个地址。

我的条件:如果这个人有一个首选地址,那么我会选择那个,否则我会选择任何一个提到的非优先地址。例如,让我们说用户也有一个首选地址和多个非首选地址。因此,如果我通过desc命令我的记录,那么我将把第一行作为首选地址,因为标志是Y.同样,如果只有非首选地址,我将从返回的结果中取第一行。

我已经看到了多个关于按功能划分的建议,但是我无法使其适用于我的场景。 所以任何帮助都会很好。

1 个答案:

答案 0 :(得分:0)

这是一个例子;我的ADDR表(实际上是因子分段)有3列:

  • EMPNO - 员工编号
  • ADDRESS - 他的地址
  • PREF - 它是首选地址吗?如果是,则其值为“y”

查询每个EMPNO的“排名”地址,按地址首选项排序。看看,调整它,使其适合您的情况。

SQL> with addr (empno, address, pref) as
      2    (select 1, 'manhattan 12', 'y' from dual union  --> this
      3     select 1, 'boulevard 1', 'n'  from dual union
      4     --
      5     select 2, 'thames st. 4', 'n' from dual union  --> any of
      6     select 2, 'snowy rd. 2', 'n'  from dual        --> these two
      7    ),
      8  ranks as
      9    (select empno, address, pref,
     10            row_number() over (partition by empno order by decode(pref, 'y', '0', '1'), address) rn
     11     from addr
     12    )
     13  select empno, address, pref
     14  from ranks
     15  where rn = 1;

         EMPNO ADDRESS      P
    ---------- ------------ -
             1 manhattan 12 y
             2 snowy rd. 2  n

    SQL>