首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当日销售与前一次销售

当日销售与前一次销售
EN

Stack Overflow用户
提问于 2015-09-18 06:35:17
回答 1查看 50关注 0票数 0

我的问题是编写一个查询,用Sale_date显示产品名称,统计当前销售的产品,计算前一天售出的产品(可能是不连续的)。我的输入表如下所示

代码语言:javascript
复制
id    Name     Brand

10    Nexus     LG

20     Z2      Sony

30    Alpha   Samsung

40     6S      Apple

我的销售表是这样的-

代码语言:javascript
复制
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

代码语言:javascript
复制
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!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-18 08:54:01

没有最近一次计数的查询很简单:

代码语言:javascript
复制
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获取前一个值将是简单而快速的。

代码语言:javascript
复制
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子句,并在一个相关子查询中获取先前的销售:

代码语言:javascript
复制
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)。如果没有它,查询就会变得更加复杂,而且可能会放慢速度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32645345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档