SQL删除一列上的重复项,然后在不使用“partition”关键字的情况下聚合另一列上的重复项

时间:2014-10-23 22:46:57

标签: sql db2 filtering

使用以下查询:

SELECT STAT, SHNO, ORDERNO FROM  BLUEWATER ORDER BY SHNO; 

我可以得到以下内容:

STAT      SHNO     ORDERNO                                                                                                                                     
40      ASN123   40303020                                                                                                                                    
40      ASN123   40303020                                                                                                                                    
30      ASN124   40303021                                                                                                                                    
30      ASN124   40303021                                                                                                                                    
30      ASN125   40303021    

我正在寻找一个查询,它将消除重复的SHNO行,然后创建第四列,它是ORDERNO重复次数的总和(此总数是在消除了SHNO重复之后计算的)。

目标数据库是DB2。我目前不知道什么版本,但将寻求确定这,虽然我假设不是最近的版本。

我的目标是产生以下内容的查询:

STAT      SHNO     ORDERNO  ORDERNOTOTAL                                                                                                                    
40      ASN123   40303020    1                                                                                                                               
30      ASN124   40303021    2                                                                                                                               
30      ASN125   40303021    2     

解决方案需要避免使用PARTITION关键字,因为此版本的DB2不接受它。

2 个答案:

答案 0 :(得分:1)

我不熟悉DB2,但以下内容适用于大多数SQL版本:

SELECT STAT, SHNO, ORDERNO, count(1) OrderNoTotal
FROM  BLUEWATER 
GROUP BY STAT, SHNO, ORDERNO
ORDER BY SHNO;   

@JohnLBevan

您的解决方案提供以下内容:

STAT      SHNO     ORDERNO    ORDERNOTOTAL  
40     ASN123      40303020    2
30     ASN124      40303021    2
30     ASN125      40303021    1

我正在寻求这个:

STAT      SHNO     ORDERNO    ORDERNOTOTAL  
40     ASN123      40303020    1
30     ASN124      40303021    2
30     ASN125      40303021    2

有两个记录有40303021,所以每个记录旁边的值是ORDERNOTOTAL中的值2


根据以上评论进行更新

http://sqlfiddle.com/#!6/7ab95/3

select STAT
, SHNO
, ORDERNO
, count(shno) over (partition by OrderNo) OrderNoTotal
from BLUEWATER
group by STAT
, SHNO
, ORDERNO

答案 1 :(得分:0)

DB2应该可以正常使用分区,但您始终可以将其表示为join

select sso.stat, sso.shno, sso.orderno, o.OrderNoTotal
from (select STAT, SHNO, ORDERNO
      from BLUEWATER
      group by STAT, SHNO, ORDERNO
     ) sso join
     (select OrderNo, count(distinct SHNO) as OrderNoTotal
      from BlueWater
      group by OrderNo
     ) o
     on o.OrderNo = sso.OrderNo;