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
我有以下代码,当我引用一个“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