各位:请帮忙考虑下下面情况的SQL如何写。谢谢!table1:
MMSNO,RNCNO,BTSNO,SECTNO,DATA1table2:
MMSNO,RNCNO,BTSNO,SECTNO,DATA2其中MMSNO,RNCNO,BTSNO,SECTNO为key。table1和table2可以通过MMSNO,RNCNO,BTSNO建立关联MMSNO,RNCNO,BTSNO的key组合,数据可以单独存在table或者table2中。也可以同时存在于这2个表中。要找出MMSNO/RNNO/BTSNOkey组合的DATA1/DATA2中的最大值。
MMSNO,RNCNO,BTSNO,SECTNO,DATA1table2:
MMSNO,RNCNO,BTSNO,SECTNO,DATA2其中MMSNO,RNCNO,BTSNO,SECTNO为key。table1和table2可以通过MMSNO,RNCNO,BTSNO建立关联MMSNO,RNCNO,BTSNO的key组合,数据可以单独存在table或者table2中。也可以同时存在于这2个表中。要找出MMSNO/RNNO/BTSNOkey组合的DATA1/DATA2中的最大值。
select key,DATA1 as datas from table
union
select key,DATA2 as datas from table2)
select key,max(datas) from t group by key
select MMSNO,RNCNO,BTSNO,max(DATA1),max(DATA2)
from
( select MMSNO,RNCNO,BTSNO,DATA1,0 DATA2 from table1
union all
select MMSNO,RNCNO,BTSNO,0, DATA2 from table2
)
group by MMSNO,RNCNO,BTSNO;
集合运算中取并集
当然,使用时两个数据集要有相同的列数
union连接去重,union all不去重(在不需要去重的地方推荐使用,
一般效率高于union)
select nvl(t1.MMSNO, t2.MMSNO),nvl(t1.RNCNO,t2.RNCNO),nvl(t1.BTSNO,t2.BTSNO),max(nvl(t1.DATA1,t2.DATA2)) from t1 full join t2 on t1.MMSNO=t2.MMSNO and t1.RNCNO=t2.RNCNO t1.BTSNO=t2.BTSNO group by nvl(t1.MMSNO, t2.MMSNO),nvl(t1.RNCNO,t2.RNCNO),nvl(t1.BTSNO,t2.BTSNO)如果按你说的
MMSNO,RNCNO,BTSNO,SECTNO,DATAtable2:
MMSNO,RNCNO,BTSNO,SECTNO,DATAtable1和table2的数据字段名是一样的。
在table1中必须以MMSNO/RNCNO/BTSNO为单位,求出最大值
在table2中也必须以MMSNO/RNCNO/BTSNO为单位,求出最大值
然后table1和table2中的最大值,还要进行比较,求出最大值。下面的SQL,可以用2条记录分别取出table1和table2的最大值,然后再进行比较。
但是有没有办法在一条记录中就能取出最大值呢?SELECT * FROM
(SELECT MMSNO,
RNCNO,
BTSNO,
MAX(DATA) OVER (PARTITION BY MMSNO,RNCNO,BTSNO)
FROM table1
UNION
SELECT MMSNO,
RNCNO,
BTSNO,
MAX(DATA) OVER (PARTITION BY MMSNO,RNCNO,BTSNO)
FROM table2
)
ORDER BY MMSNO,BTSNO,RNCNO
RNCNO,
BTSNO,
MAX(DATA) OVER(PARTITION BY MMSNO, RNCNO, BTSNO)
FROM (SELECT MMSNO,
RNCNO,
BTSNO,
MAX(DATA) OVER(PARTITION BY MMSNO, RNCNO, BTSNO)
FROM table1
UNION
SELECT MMSNO,
RNCNO,
BTSNO,
MAX(DATA) OVER(PARTITION BY MMSNO, RNCNO, BTSNO)
FROM table2)
RNCNO,
BTSNO,
number1,
MAX(number1) OVER(PARTITION BY MMSNO, RNCNO, BTSNO)
FROM (SELECT MMSNO,
RNCNO,
BTSNO,
MAX(DATA) OVER(PARTITION BY MMSNO, RNCNO, BTSNO) number1
FROM table1
UNION
SELECT MMSNO,
RNCNO,
BTSNO,
MAX(DATA) OVER(PARTITION BY MMSNO, RNCNO, BTSNO) number1
FROM table2)