查找创建日期后的第一笔交易并添加到MySQL列中

时间:2020-05-25 06:23:39

标签: mysql

我正在使用MySQL 8.0版

MRE:

create table users(
    user varchar(5),
    work_type varchar(20),
    time datetime
);

insert into users(user, work_type, time)
Values ("A", "create", "2020-01-01 11:11:11")
     , ("A", "bought", "2020-01-04 16:11:11")
     , ("A", "bought", "2020-01-07 18:10:10")
     , ("A", "bought", "2020-01-08 12:00:11")
     , ("A", "create", "2020-02-02 15:17:11")
     , ("A", "bought", "2020-02-02 16:11:11");

在我的表中,每个用户都有一个“ work_type”列,用于指定用户的工作。

user     work_type           time
 A        create        2020-01-01 11:11:11
 A        bought        2020-01-04 16:11:11
 A        bought        2020-01-07 18:10:10
 A        bought        2020-01-08 12:00:11
 A        create        2020-02-02 15:17:11
 A        bought        2020-02-02 16:11:11

自从用户A“创建”他们的帐户之后,我只想查找首次购买时间并将其添加到新列中

user     work_type           time              bought_time
 A        create        2020-01-01 11:11:11   2020-01-04 16:11:11
 A        create        2020-02-02 15:17:11   2020-02-02 16:11:11

请注意,用户A可以具有多个create work_type。上面是所需的输出,但是也会有多个用户。

2 个答案:

答案 0 :(得分:1)

选择列表中的相关子查询可以检索单个值。我使用order by time asc limit 1子句将返回的行数限制为1:

select t.*, (select t2.`time` from yourtable t2 where t2.user=t.user and t2.`time` > t.`time` and t2.work_type='bought' order by t2.`time` asc limit 1) as bought_time
from yourtable t
where work_type='create'

上面的查询很好,只要每个创建一个记录后至少有1个购买记录即可。如果您不能保证这一点,并且没有其他字段可以将创建内容与随后的购买链接起来,则必须使事情复杂化,以检查创建之后的下一条记录的类型。注意:我不再过滤子查询中的work_type字段:

select t.*, (select if(t2.work_type='bought',t2.`time`,null) from yourtable t2 where t2.user=t.user and t2.`time` > t.`time` order by t2.`time` asc limit 1) as bought_time
from yourtable t
where work_type='create'

如果创建和随后购买的记录构成集合的一部分,那么我肯定会创建一个将它们链接在一起的字段,这意味着该字段对于属于同一集合的所有记录将具有相同的值。这样,很容易确定哪些记录构成集合的一部分。

答案 1 :(得分:0)

您的问题的解决方案:

SELECT * FROM
(
SELECT 
user
,work_type
,CASE WHEN UPPER(work_type) = 'CREATE' THEN time END time
,CASE WHEN UPPER(work_type) = 'CREATE' 
THEN LEAD(time) OVER(PARTITION BY user ORDER BY time) END bought_time
FROM 
Table1) A
WHERE UPPER(work_type) = 'CREATE';

演示链接: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=ac0cf9375025b964769fd28514db0ce1

相关问题