我的问题是编写一个查询来显示带有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
我知道我可以用延迟来做,但有没有使用滞后的方法。如果有人能建议的话。谢谢!!!
答案 0 :(得分:1)
没有最近计数的查询很简单:
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
)。没有它,查询将变得更加复杂并且可能会变慢。