Рассчитать разницу в часах / днях между различными действиями одного и того же пользователя sql - PullRequest
0 голосов
/ 21 марта 2019

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

Другая проблема состоит в том, что строки заказа являются дубликатами из-за другого столбца в таблице, называемого order_received time, с интервалом в 5 секунд, поскольку эти две строки создаются для одних и тех же пользователей с одинаковым временем заказа.

1 Ответ

1 голос
/ 22 марта 2019

На основании вашего комментария к моему первоначальному ответу здесь приведен еще один рабочий лист.

Таблица DDL

create table tbl_order(
  order_id integer,
  account_number integer,
  ordered_at date
);

Данные, как в другой указанной вами теме

insert into tbl_order values (1, 1001, to_date('10-Sep-2019 00:00:00', 'DD-MON-YYYY HH24:MI:SS'));
insert into tbl_order values (2, 2001, to_date('01-Sep-2019 00:00:00', 'DD-MON-YYYY HH24:MI:SS'));
insert into tbl_order values (3, 2001, to_date('03-Sep-2019 00:00:00', 'DD-MON-YYYY HH24:MI:SS'));
insert into tbl_order values (4, 1001, to_date('12-Sep-2019 00:00:00', 'DD-MON-YYYY HH24:MI:SS'));
insert into tbl_order values (5, 3001, to_date('18-Sep-2019 00:00:00', 'DD-MON-YYYY HH24:MI:SS'));
insert into tbl_order values (6, 1001, to_date('20-Sep-2019 00:00:00', 'DD-MON-YYYY HH24:MI:SS'));

Запрос

WITH VW AS (
  SELECT ACCOUNT_NUMBER, 
    MIN(ORDERED_AT) EARLIEST_ORDER_AT, 
    MAX(ORDERED_AT) LATEST_ORDER_AT, 
    ROUND(MAX(ORDERED_AT) - MIN(ORDERED_AT), 5)  DIFF_IN_DAYS,
    COUNT(*) TOTAL_ORDER_COUNT
  FROM TBL_ORDER
  GROUP BY ACCOUNT_NUMBER
)
SELECT ACCOUNT_NUMBER, EARLIEST_ORDER_AT, LATEST_ORDER_AT, 
  DIFF_IN_DAYS, ROUND( DIFF_IN_DAYS/TOTAL_ORDER_COUNT, 4) AVERAGE 
FROM VW;

Результат

enter image description here

=========== Первоначальный ответ здесь и далее ===========

Ваш вопрос не совсем понятен, например

  1. Хотите ли вы разницу вдата в день (пользователь может сделать несколько заказов в день) или только между их самыми ранними и самыми последними заказами
  2. Что вы подразумеваете под средним значением - это просто (последняя дата заказа - самая ранняя дата заказа) / общая сумма покупки?Это будут часы / покупка.это даже полезно?

В любом случае, вот рабочий лист, этого будет достаточно, чтобы направить вас в правильном направлении (надеюсь).Это для базы данных Oracle, будет работать в основном для других баз данных, кроме функций преобразования времени, используемых здесь.Вам придется искать и использовать эквивалентные функции для базы данных по вашему выбору, если это не Oracle.

Создать таблицу

create table tbl_order(
  order_id integer,
  user_id integer,
  item varchar2(100),
  ordered_at date
);

Вставить некоторые данные

insert into tbl_order values (8, 1, 'A2Z', to_date('21-Mar-2019 16:30:20', 'DD-MON-YYYY HH24:MI:SS'));
insert into tbl_order values (1, 1, 'ABC', to_date('22-Mar-2019 07:30:20', 'DD-MON-YYYY HH24:MI:SS'));
insert into tbl_order values (2, 1, 'ABC', to_date('22-Mar-2019 07:30:20', 'DD-MON-YYYY HH24:MI:SS'));
insert into tbl_order values (3, 1, 'EFGT', to_date('22-Mar-2019 09:30:30', 'DD-MON-YYYY HH24:MI:SS'));
insert into tbl_order values (4, 1, 'XYZ', to_date('22-Mar-2019 12:38:50', 'DD-MON-YYYY HH24:MI:SS'));
insert into tbl_order values (5, 1, 'ABC', to_date('22-Mar-2019 16:30:20', 'DD-MON-YYYY HH24:MI:SS'));
insert into tbl_order values (6, 2, 'ABC', to_date('22-Mar-2019 14:20:20', 'DD-MON-YYYY HH24:MI:SS'));
insert into tbl_order values (7, 2, 'A2C', to_date('22-Mar-2019 14:20:50', 'DD-MON-YYYY HH24:MI:SS'));

Получить последнюю, самую раннюю и общую_покупкуна пользователя и в среднем

WITH VW AS (
  SELECT USER_ID, 
  TO_CHAR(MIN(ORDERED_AT), 'DD-MON-YYYY HH24:MI:SS') EARLIEST_ORDER_AT, 
  TO_CHAR(MAX(ORDERED_AT), 'DD-MON-YYYY HH24:MI:SS')LATEST_ORDER_AT, 
  ROUND(MAX(ORDERED_AT) - MIN(ORDERED_AT), 5) * 24 DIFF_IN_HOURS,
  COUNT(*) TOTAL_ORDER_COUNT
  FROM TBL_ORDER
  GROUP BY USER_ID
)
SELECT USER_ID, EARLIEST_ORDER_AT, LATEST_ORDER_AT, 
  DIFF_IN_HOURS,  DIFF_IN_HOURS/TOTAL_ORDER_COUNT AVERAGE 
FROM VW;

Получите самую последнюю, самую раннюю и общую_купку на пользователя в день и в среднем

WITH VW AS (
  SELECT USER_ID, TO_CHAR(ORDERED_AT, 'DD-MON-YYYY') ORDER_DATE_PART, 
  TO_CHAR(MIN(ORDERED_AT), 'DD-MON-YYYY HH24:MI:SS') EARLIEST_ORDER_AT, 
  TO_CHAR(MAX(ORDERED_AT), 'DD-MON-YYYY HH24:MI:SS')LATEST_ORDER_AT, 
  ROUND(MAX(ORDERED_AT) - MIN(ORDERED_AT), 5) * 24 DIFF_IN_HOURS,
  COUNT(*) TOTAL_ORDER_COUNT
  FROM TBL_ORDER
  GROUP BY USER_ID, TO_CHAR(ORDERED_AT, 'DD-MON-YYYY')
)
SELECT USER_ID, ORDER_DATE_PART, EARLIEST_ORDER_AT, LATEST_ORDER_AT, 
  DIFF_IN_HOURS,  DIFF_IN_HOURS/TOTAL_ORDER_COUNT AVERAGE 
FROM VW;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...