繁体   English   中英

计算同一用户SQL在不同操作之间的小时/天差异

[英]Calculate difference in hours/days between different actions by a same user sql

我有一个表,用户在其中执行订单操作。 我想了解他的两个或多个订单之间的日期差异。 然后为所有用户相似,然后计算其平均值或中位数。

另一个问题是订单行是重复的,因为表中的另一列称为order_received time,相隔5秒,因为这两行是为具有相同订单时间的同一用户创建的。

根据您对我的最初答案的评论,这里是另一个工作表。

表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;

结果

在此处输入图片说明

===========此后的初始答案===========

例如,您的问题并不十分清楚

  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'));

获取每位用户的最新,最早和total_purchase的平均值

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;

获取每位用户每天最新,最早和total_purchase的平均费用

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM