Oracle Sql-запрос для подсчета времени по определенным критериям

Запрос 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 ответ

Решение

Это не проверено, но я думаю, что это может дать вам то, что вы ищете.

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
Другие вопросы по тегам