Mysql 使用时间戳编写SQL
数据 如果不存在“事务”,则创建表 `事务的时间戳, `用户_id`int6未签名非空, `事务处理_id`bigint, `项目'varchar200,主键'transaction\u id` 默认字符集=utf8; 在'transactions``transactions\'ts`、'user\'id`、'transaction\'id`、'item`值中插入 “2016-06-18 13:46:51.0”,13811351322361417,“手套”, “2016-06-18 17:29:25.0”,13811353729362318,“帽子”, “2016-06-18 23::07:12.0”,13811351322363995,“花瓶”, “2016-06-19 07:14:56.0”,13811357482365143,“杯赛”, “2016-06-19 21:59:40.0”,13811351322369619,“镜子”, “2016-06-17 12:39:46.0”,33780241019322351612,“连衣裙”, “2016-06-17 20:22:17.0”,33780241019322353031,“花瓶”, “2016-06-20 11:29:02.0”,33780241016928364072,“领带”, “2016-06-20 18:59:48.0”,13811351322375547,“镜子”; 问题:对于每个用户,按时间显示他们首先订购的第一项。我假设时间是一个整体时间戳,而不是单独的时间和日期。 我的尝试 选择 作为第一次交易的最小交易, 用户id,项目 来自交易 按用户id分组 由第一批运输商订购; 很抱歉,这可能是一个简单的问题,但有人告诉我,我的问题是完全错误的。我没有其他方法来检验他的说法Mysql 使用时间戳编写SQL,mysql,sql,Mysql,Sql,数据 如果不存在“事务”,则创建表 `事务的时间戳, `用户_id`int6未签名非空, `事务处理_id`bigint, `项目'varchar200,主键'transaction\u id` 默认字符集=utf8; 在'transactions``transactions\'ts`、'user\'id`、'transaction\'id`、'item`值中插入 “2016-06-18 13:46:51.0”,13811351322361417,“手套”, “2016-06-18 17:29:
这比你想象的要复杂一点 首先:对于每个用户,将转换为按用户id分组,而不是按用户id分组,项目 但是,对于GROUP BY user_id,您需要一个聚合函数来表示最小事务的项。MySQL没有这样的聚合函数 显而易见的解决方案是采取以下两个步骤: 查找每个用户的第一个事务 显示这些事务的项目 查询:
select *
from transactions
where (user_id, transactions_ts) in
(
select user_id, min(transactions_ts)
from transactions
group by user_id
);
select *
from transactions t
where not exists
(
select *
from transactions t2
where t2.user_id = t.user_id
and t2.transactions_ts < t.transactions_ts
);
另一种描述任务的方法是:给我没有相同用户的旧事务的事务
查询:
select *
from transactions
where (user_id, transactions_ts) in
(
select user_id, min(transactions_ts)
from transactions
group by user_id
);
select *
from transactions t
where not exists
(
select *
from transactions t2
where t2.user_id = t.user_id
and t2.transactions_ts < t.transactions_ts
);
您可以使用子查询来获取每个用户的第一个事务:
select user_id, item, transactions_ts
from transactions a
where transactions_ts=(select min(transactions_ts)
from transactions b
where b.user_id=a.user_id)
因此,您可以:
在内部查询中,获取每个用户的第一个事务时间
在外部查询中,您将得到一行,该行具有在第1点获得的时间
如果您使用的是MySQL 8.0,可以使用窗口函数ROW_NUMBER来处理您的用例,如下所示:
SELECT transactions_ts, user_id, item
FROM (
SELECT
transactions_ts,
user_id,
item,
ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY transactions_ts) rn
FROM transactions
) x WHERE rn = 1
内部查询在具有相同用户id的记录组中按升序时间戳对每个记录进行排序。外部查询在每个客户的第一笔交易中进行筛选
:
假设您的事务ID是增量的,为什么不按这些ID排序呢?您的查询不正确。您正在按用户id分组,因此该项可能是不确定的。您应该特别回顾与函数依赖性相关的部分。@BenM的假设太多了。我只是得到了数据,没有人告诉我任何关于事务ID的信息。@BenM你没有信息可以假设你以一种无效的方式使用GROUP BY,这会为项目提供不确定的随机值,a应该发生在这里。。如果该组记录的项目值是正确的,这纯粹是基于运气,因为您在这里玩俄罗斯轮盘赌。我的原始查询只是按用户id分组,而不是按项分组。我编辑了这个问题,当我注意到它在分组中也有项目时,你的第一个选项不是做得完全一样吗?只是按用户id分组。我知道了。谢谢基本上,sql幸运地找到了与第一个事务相对应的项。我应该按照用户id和项进行分组,以避免@raymon nijland指出的错误,但结果将是垃圾