Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
延迟SQL命令的替代方法_Sql_Oracle_Oracle10g - Fatal编程技术网

延迟SQL命令的替代方法

延迟SQL命令的替代方法,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我有一张这样的桌子 Month-----Book_Type-----sold_in_Dollars Jan----------A------------ 100 Jan----------B------------ 120 Feb----------A------------ 50 Mar----------A------------ 60 Mar----------B------------ 30 等等 我必须根据最近两个月的销售额计算每个月的预期销售额和图书类型。 所以对于三月和A型,它将

我有一张这样的桌子

Month-----Book_Type-----sold_in_Dollars
Jan----------A------------ 100
Jan----------B------------ 120
Feb----------A------------ 50
Mar----------A------------ 60
Mar----------B------------ 30
等等

我必须根据最近两个月的销售额计算每个月的预期销售额和图书类型。 所以对于三月和A型,它将是100+50/2=75 对于3月和B型,由于没有2月的数据,因此为120/1

我试图使用lag函数,但它不起作用,因为几行中缺少数据


有什么想法吗

据我所知,你可以给滞后一个默认值:

  SELECT Book_Type, 
         (lag(sold_in_Dollars, 1, 0) OVER(PARTITION BY Book_Type ORDER BY Month) + lag(sold_in_Dollars, 2, 0) OVER(PARTITION BY Book_Type ORDER BY Month))/2 AS expected_sales
    FROM your_table
GROUP BY Book_Type

假设月份列实际上不包含1月或2月,而是包含真实的、可订购的日期。

请原谅sql server语法之类的内容,但您可以理解:

Select Book_type, AVG(sold_in_dollars)
from MyTable
where Month in (Month(DATEADD('mm'-1,GETDATE)),Month(DATEADD('mm'-2,GETDATE)))
group by booktype

因为它计划忽略缺失的值,所以这可能会起作用。目前还没有一个数据库来测试它,但明天早上会再次尝试

select 
  month, 
  book_type, 
  sold_in_dollars, 
  avg(sold_in_dollars) over (partition by book_type order by month
    range between interval '2' month preceding and interval '1' month preceding) as avg_sales
from myTable;
这类假设月份有一个日期数据类型,并且可以根据。。。如果它只是一个文本字符串,那么您将需要其他内容

通常,您可以只使用前2行和前1行之间的行,但如果缺少行,则这将使用前两个数据点,而不一定是前两个月的数据点


你可以用lag来解决这个问题,但它会有点复杂。

分区外部连接可以帮助创建丢失的数据。创建一组月份,按月份将这些值连接到每一行,并对每种图书类型执行一次连接。在本例中,我创建了一月到四月的月份:

with test_data as
(
  select to_date('01-JAN-2010', 'DD-MON-YYYY') month, 'A' book_type, 100 sold_in_dollars from dual union all
  select to_date('01-JAN-2010', 'DD-MON-YYYY') month, 'B' book_type, 120 sold_in_dollars from dual union all
  select to_date('01-FEB-2010', 'DD-MON-YYYY') month, 'A' book_type, 50 sold_in_dollars from dual union all
  select to_date('01-MAR-2010', 'DD-MON-YYYY') month, 'A' book_type, 60 sold_in_dollars from dual union all
  select to_date('01-MAR-2010', 'DD-MON-YYYY') month, 'B' book_type, 30 sold_in_dollars from dual
)
select book_type, month, sold_in_dollars
  ,case when denominator = 0 then 'N/A' else to_char(numerator / denominator) end expected_sales
from
(
  select test_data.book_type, all_months.month, sold_in_dollars
    ,count(sold_in_dollars) over
      (partition by book_type order by all_months.month rows between 2 preceding and 1 preceding) denominator
    ,sum(sold_in_dollars) over
      (partition by book_type order by all_months.month rows between 2 preceding and 1 preceding) numerator
  from 
    (
      select add_months(to_date('01-JAN-2010', 'DD-MON-YYYY'), level-1) month from dual connect by level <= 4
    ) all_months
    left outer join test_data partition by (test_data.book_type) on all_months.month = test_data.month 
)
order by book_type, month

插入值并运行它。据我所知,average忽略空值,因此如果对两行进行平均,其中一个值为空,则它只除以1。@MikeyByCrikey:但OP提供了一个不使用空值的示例-如果当月没有销售,这个月根本没有出现在表格中。@OMG Ponies:如果把我的评论解读为对米兰的“重播”,那就更有意义了。但是今天早上读到最初的评论,我从中得到了与昨晚不同的含义。+1-我认为应该按月份划分,而不是按图书类型划分。只是一个意见。。。