【问题标题】:SQL to remove duplicates on one column and then aggregating duplicates on another column without using "partition" keywordSQL 删除一列上的重复项,然后在不使用“分区”关键字的情况下聚合另一列上的重复项
【发布时间】:2014-12-19 18:00:58
【问题描述】:

使用以下查询:

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 不接受它。

【问题讨论】:

  • 以下哪个查询?您可以发布生成第一个示例的代码吗?
  • 总和是指计数吗?如果是这样,您所需示例中的 asn123 和 asn125 看起来好像是错误的方式?

标签: sql db2 filtering


【解决方案1】:

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;

【讨论】:

  • 它抱怨'('附近的语法不正确。我需要纠正什么吗?
  • @TobyDerrum 。 . .我没有注意到任何明显的东西。
  • 对不起,这一定是一个糟糕的复制粘贴工作。虽然现在计算是错误的。 OrderNoTotal 不排除 ORDERNO - SHNO 重复项,这是关键要求。
【解决方案2】:

我不熟悉 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

【讨论】:

  • 但是如果两行具有相同的 SHNO 值,但不同的 STAT 和 ORDERING 值,那么这将是两个不同的组,并且此查询的目的是消除重复的 SHNO,你不应该吗?从组中删除 SHNO?
  • 它们不应该有不同的 STAT 值,因为我会将 SHNO 的所有 STATS 值更新为相同的值。
  • @kolonel:如果你有不同的值,那么是的,你会得到额外的行。但是,如果您有不同的值,您将如何在同一行中显示同一列的两个值?您可以通过仅显示 2 个值中的 1 个(例如使用 min(STAT) over (partition by SHNO order by STAT) 或类似值)来解决此问题,但我的猜测(基于示例数据)并不是我们想要的。
  • @JohnLBevan 不幸的是,DB2 数据库不喜欢使用分区。有办法解决吗?我在一个可能相关的论坛上读到了一些东西:forums.iprodeveloper.com/forums/aft/148438
猜你喜欢
  • 1970-01-01
  • 2014-12-20
  • 2015-06-14
  • 1970-01-01
  • 2019-04-03
  • 2013-08-01
  • 1970-01-01
  • 2018-12-01
  • 2023-01-19
相关资源
最近更新 更多