SQL 过度分区 过度分区

SQL Over Partition By Over Partition By

我有以下代码,当我引用一个“leadno”时它工作正常,因为它return是单个产品的最高总和

select t.*
from (Select t2.leadno, t1.quoteno, t1.cn_ref, sum(t1.qty/100) as 't_qty',
             ROW_NUMBER() Over (Partition By t1.cn_ref order by sum(qty/100) desc) as RN 
      From dba.quotelne t1 INNER JOIN
           dba.quotehdr t2
           ON t1.quoteno = t2.quoteno
      Where leadno = 31665 and t1.statusflag = 'A' and t2.statusflag = 'A' 
      Group By t2.leadno, t1.quoteno, t1.cn_ref
     ) t
where rn = 1

但是当我添加更多 leadno 它 returns 不会 return 所有 quoteno 它只是 returns 的值最高的sum(qty/100),所以有没有办法在ROW_NUMBER() Over (Partition By)

中运行一个ROW_NUMBER() Over (Partition By

我希望这是有道理的,但如果没有,我会尝试进一步解释,每个 'lead' 可能有一个或多个 'quotes' 反对它。每个 'quote' 将列出许多产品。这些可能会重复(因此我使用 sum(qty/100) 的原因我需要做的是显示所有 leadno,唯一 cn_ref 和最大数量 RN = 1 反对 leadno

我不是 100% 确定,但我认为您需要将 leadno 放入分区中才能完成您的需要:

select t.*
    from (Select t2.leadno, t1.quoteno, t1.cn_ref, sum(t1.qty/100) as 't_qty',
         ROW_NUMBER() Over (Partition By t2.leadno, t1.cn_ref order by sum(qty/100) desc) as RN 
      From dba.quotelne t1 INNER JOIN
           dba.quotehdr t2
       ON t1.quoteno = t2.quoteno
      Where leadno = 31665 and t1.statusflag = 'A' and t2.statusflag = 'A' 
      Group By t2.leadno, t1.quoteno, t1.cn_ref
     ) t
where rn = 1

除此之外,您不应该在 order by 中划分数量,它不会更改顺序,因为您将每个值都除以 100,但引擎必须在创建摘要之前划分每条记录

为什么您需要使用 ROW_NUMBER() OVER (PARTITION BY)?

如果我了解您的需求,您需要以下值:leadno, cn_ref, max(sum(qty/100))

那么,试试这个查询:

Select t2.leadno, t1.cn_ref, max(sum(t1.qty/100)) as 't_qty',
  From dba.quotelne t1 INNER JOIN
       dba.quotehdr t2
       ON t1.quoteno = t2.quoteno
  Where leadno = 31665 and t1.statusflag = 'A' and t2.statusflag = 'A' 
  Group By t2.leadno