Oracle SQL - Как получить разницу в количестве ID между сегодняшним и вчерашним днем - PullRequest
0 голосов
/ 07 октября 2019

У меня есть таблица, которая фиксирует, когда клиент покупает продукт. Он фиксирует уникальный идентификатор покупки вместе с отметкой времени, когда была совершена покупка.

Я хочу иметь возможность запрашивать информацию о разнице между тем, сколько покупок было сделано сегодня по сравнению со вчерашним днем?

Неуверены, как запросить это на оракуле?

Ответы [ 3 ]

2 голосов
/ 07 октября 2019

Вы можете использовать условное агрегирование:

select sum(case when trunc(datecol) = trunc(sysdate - 1) then 1 else 0 end) as num_yesterday,
       sum(case when trunc(datecol) = trunc(sysdate) then 1 else 0 end) as num_today,
       sum(case when trunc(datecol) = trunc(sysdate) then 1
                when trunc(datecol) = trunc(sysdate - 1) then -1
           end) as diff
from t
where datecol >= trunc(sysdate - 1);
0 голосов
/ 07 октября 2019

Использование TRUNC для столбца не позволит Oracle использовать индекс для этого столбца (вместо этого вам потребуется отдельный индекс на основе функций);вместо этого используйте оператор CASE, чтобы проверить, находится ли дата между началом дня и началом следующего дня, а затем COUNT значения между этими диапазонами:

SELECT COUNT(
         CASE
         WHEN TRUNC( SYSDATE ) - INTERVAL '1' DAY <= your_date_column
         AND  your_date_coumn < TRUNC( SYSDATE )
         THEN 1
         END
       ) AS count_for_yesterday,
       COUNT(
         CASE
         WHEN TRUNC( SYSDATE ) <= your_date_column
         AND  your_date_coumn < TRUNC( SYSDATE ) + INTERVAL '1' DAY
         THEN 1
         END
       ) AS count_for_today
FROM   your_table
WHERE  TRUNC( SYSDATE ) - INTERVAL '1' DAY <= your_date_column
AND    your_date_coumn < TRUNC( SYSDATE ) + INTERVAL '1' DAY
0 голосов
/ 07 октября 2019

Вы можете использовать функцию группировки для группировки дня покупки с информацией о временной отметке и подсчета идентификатора покупки.

select trunc(purchase_ts) Day, count(purchase_id) Count
from purchase
group by trunc(purchase_ts)
order by 1 
...