Oracle Sql查询以某些条件计算时间跨度

时间:2014-07-11 02:20:08

标签: oracle count timespan

Oracle Sql查询,我试图计算大于2的时间差的总计,但是当我尝试这个时它只计算了查询中的所有行,而不仅仅是那些具有我正在寻找的标准的行对于。任何人都知道我缺少什么或更好的方法。谢谢 这是我的查询

    select DC.CUST_FIRST_NAME,DC.CUST_LAST_NAME,oi.customer_id,oi.order_timestamp,oi.order_timestamp - LAG(oi.order_timestamp) OVER (ORDER BY oi.order_timestamp) AS "Difference(In Days)" , 
   (select Count('Elapsed Order Difference')
    from demo_orders oi,
    demo_customers dc
    where OI.CUSTOMER_ID = DC.CUSTOMER_ID 
    group by 'Elapsed Order Difference'
    having count('Elapsed Order Difference') > 3
    )Total
     from demo_orders oi,
    demo_customers dc
    where OI.CUSTOMER_ID = DC.CUSTOMER_ID


    Results
    CUST_FIRST_NAME CUST_LAST_NAME CUSTOMER_ID ORDER_TIMESTAMP      Difference(In Days)    TOTAL
    Eugene          Bradley             7       8/14/2013 5:59:11 PM                        10
    William         Hartsfield          2       8/28/2013 5:59:11 PM    14                 10
    Edward "Butch"  OHare               4       9/8/2013 5:59:11 PM     11                  10
     Edward         Logan               3       9/10/2013 5:59:11 PM    2                    10
     Edward         Logan               3       9/20/2013 5:59:11 PM    10                  10
     Albert         Lambert             6       9/25/2013 5:59:11 PM    5                   10
     Fiorello       LaGuardia           5       9/30/2013 5:59:11 PM    5                   10
    William         Hartsfield          2       10/8/2013 5:59:11 PM    8                   10
    John            Dulles              1       10/14/2013 5:59:11 PM   6                   10
    Eugene          Bradley             7       10/17/2013 5:59:11 PM   3                   10

1 个答案:

答案 0 :(得分:1)

这是未经测试的,但我认为它可能会给你你想要的东西。

with raw_data as (
  select
    dc.cust_first_name, dc.cust_last_name,
    oi.customer_id, oi.order_timestamp,
    oi.order_timestamp - LAG(oi.order_timestamp) OVER
      (ORDER BY oi.order_timestamp) AS "Difference(In Days)",
    case
      when oi.order_timestamp - LAG(oi.order_timestamp)
        over (ORDER BY oi.order_timestamp) > 2 then 1
      else 0
    end as gt2
  from
    demo_orders oi,
    demo_customers dc
  where
    oi.customer_id = dc.customer_id  
)
select
  cust_first_name, cust_last_name,
  customer_id, order_timestamp,
  "Difference(In Days)",
  sum (gt2) over (partition by 1) as total
from raw_data

当您执行上述Count('Elapsed Order Difference')时,无论如何,您都在计算每一行。您可以放置​​count ('frog')count (*)并获得相同的结果。 having count > 3已经满足,因为所有行的计数都是10。

一般情况下,我会尽量避免在示例中使用标量作为查询中的字段。我不是说这从来不是一个好主意,但我认为通常有更好的方法来做到这一点。有10行,您几乎不会注意到性能差异,但随着数据集的增长,这可能会产生问题。

预期产出:

fn  ln  id  order date  dif total    
E   B   7   8/14/2014       8
W   H   2   8/28/2014   14  8
E   O   4   9/8/2014    11  8
E   L   3   9/10/2014   2   8
E   L   3   9/20/2014   10  8
A   L   6   9/25/2014   5   8
F   L   5   9/30/2014   5   8
W   H   2   10/8/2014   8   8
J   D   1   10/14/2014  6   8
E   B   7   10/17/2014  3   8