我在Oracle SQL中使用发票数据。我想创建一个变量,"截至日期的中位数帐户发票金额",它给出截至给定发票日期的帐户的中位数发票金额。
Oracle实际上有一个median
函数。查找每天所有帐户的中位数:
select median(amount)
from invoices
或者显示每天每个账户的中位数:
select AccountNr
, to_char(InvoiceDate, 'yyyymmdd')
, median(amount)
from invoices
group by
AccountNr
, to_char(InvoiceDate, 'yyyymmdd')
或者显示"运行中位数":
select i1.custID
, i1.inv_date
, median(i2.amount)
from invoices i1
join invoices i2
on i2.custId = i1.custID
and i2.inv_date <= i1.inv_date
group by
i1.custID
, i1.inv_date
据我所知,这就是你想要的。@Andomar,因为中位数是一系列数字的中间,排序这个系列对结果没有影响。最高和最低之间的中间数不能改变。
因此,数据和帐户的中位数将是:
select acc_no, median(amount) over ( partition by acc_no, to_char(invoice_date,'yyyymmdd'))
from invoices
-- if applicable
where invoice_date < :date
中位数为
select acc_no, median(amount) over ( partition by acc_no )
from invoices
where invoice_date < :date