我的问题是编写一个查询,用Sale_date显示产品名称,统计当前销售的产品,计算前一天售出的产品(可能是不连续的)。我的输入表如下所示
id Name Brand
10 Nexus LG
20 Z2 Sony
30 Alpha Samsung
40 6S Apple我的销售表是这样的-
Invoice_No,Product_Id Sale_Date Quantity
122300 10 23-11-14 09:00:00 AM 5
122300 20 23-11-14 05:00:00 PM 2
122311 10 24-11-14 10:00:00 AM 1
122312 20 24-11-14 10:05:00 AM 2
122313 10 24-11-14 10:10:00 AM 10
122314 30 24-11-14 12:00:00 PM 10
122315 10 24-11-14 04:00:00 PM 3
122316 40 25-11-14 11:33:00 PM 2
122317 10 29-11-14 03:10:15 PM 5
122318 20 30-11-14 05:06:10 PM 10
122319 10 30-11-14 11:15:06 AM 15
122320 10 01-12-14 12:00:00 PM 10我的输出表是这样-
Product_id,Sale_Date,CurrentDay_Count,PrevDay_count
10 23-11-14 5
10 24-11-14 14 15
20 23-11-14 2
20 24-11-14 2 2
30 24-11-14 10
30 25-11-14 3 10
40 25-11-14 2
10 29-11-14 5 14
20 30-11-14 10 2
10 30-11-14 15 5
10 01-12-14 10 15我知道我可以用滞后来做这件事,但有没有办法不用滞后呢?如果是能有人suggests.Thanks!
发布于 2015-09-18 08:54:01
没有最近一次计数的查询很简单:
select
product_id,
trunc(sale_date) as sale_date,
sum(quantity) as currentday_count
from sales
group by trunc(sale_date), product_id
order by trunc(sale_date), product_id;使用LAG获取前一个值将是简单而快速的。
select
product_id,
sale_date,
currentday_count,
lag(currentday_count) over (partition by product_id order by sale_date) as prevday_count
from
(
select
product_id,
trunc(sale_date) as sale_date,
sum(quantity) as currentday_count
from sales
group by trunc(sale_date), product_id
)
order by sale_date, product_id;但是已经要求您不要使用LAG,而是编写一个更慢、更复杂的查询。您必须多次访问相同的中间结果(每日销售),因此您将使用一个WITH子句,并在一个相关子查询中获取先前的销售:
with daily_sales as
(
select
product_id,
trunc(sale_date) as sale_date,
sum(quantity) as currentday_count
from sales
group by trunc(sale_date), product_id
)
select
product_id,
sale_date,
currentday_count,
(
select max(currentday_count) keep (dense_rank last order by sale_date)
from daily_sales older
where older.product_id = daily_sales.product_id
and older.sale_date < daily_sales.sale_date
) as prevday_count
from daily_sales
order by sale_date, product_id;这仍然使用了一个分析函数(KEEP LAST)。如果没有它,查询就会变得更加复杂,而且可能会放慢速度。
https://stackoverflow.com/questions/32645345
复制相似问题