【问题标题】:Calculate difference in hours/days between different actions by a same user sql计算同一用户 sql 的不同操作之间的小时/天差异
【发布时间】:2019-08-12 13:29:57
【问题描述】:

我有一张表,用户可以在其中执行订单操作。我想知道他的两个或多个订单之间的日期差异。对所有用户都类似,然后计算他们的平均值或中位数。

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

【问题讨论】:

  • 订单之间的平均间隔,对于一个客户来说,就是第一个订单和最后一个订单之间的间隔,除以订单数量。然后只计算所有客户的平均值或中位数?
  • 您尝试了什么?这样的试验有什么问题? SO 旨在帮助产生错误或不良结果的认真编码工作。现在这个问题太宽泛了。
  • 在这里找到了部分答案。正在尝试做类似的事情stackoverflow.com/questions/9994862/…
  • @dj17 提供一些示例表数据和预期的结果。

标签: sql db2


【解决方案1】:

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

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

获取每个用户的最新、最早和总购买量以及平均值

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;

【讨论】:

  • 嗨,格罗,感谢您的回答。但是我正在尝试做一些不同的事情。我的数据与这个问题stackoverflow.com/questions/9994862/… 中的数据相同,但是在解决方案中。我想要每个帐号只需要一行,然后是他们日期之间的平均天数。添加 avg(Daysdiff) 显示错误。
  • 根据您的额外清晰度,我在答案中添加了另一部分。看看它是否满足您的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 2017-07-13
  • 2020-02-14
相关资源
最近更新 更多