我一直在尝试通过sql中的函数来理解over partition,因为我已经根据一些参数编写了一个查询,我为这个参数获取了相同id的多个记录。他们查询我写的是怀疑地获取一个人的详细信息,如他的名字,dob,地址等等。在这种情况下,我得到多个记录,因为用户的地址多于一个。目前我已经使用了首选地址,但可能会出现用户没有任何首选地址,因此即使匹配到该地址,我也无法获得该人的详细信息我给出的参数。所以我想我必须使用这个所谓的over partition,这样我每个用户得到1个地址。
我的条件:如果这个人有一个首选地址,那么我会选择那个,否则我会选择任何一个提到的非优先地址。例如,让我们说用户也有一个首选地址和多个非首选地址。因此,如果我通过desc命令我的记录,那么我将把第一行作为首选地址,因为标志是Y.同样,如果只有非首选地址,我将从返回的结果中取第一行。
我已经看到了多个关于按功能划分的建议,但是我无法使其适用于我的场景。 所以任何帮助都会很好。
答案 0 :(得分:0)
这是一个例子;我的ADDR表(实际上是因子分段)有3列:
查询每个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>