Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用时间戳编写SQL_Mysql_Sql - Fatal编程技术网

Mysql 使用时间戳编写SQL

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`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分组 由第一批运输商订购; 很抱歉,这可能是一个简单的问题,但有人告诉我,我的问题是完全错误的。我没有其他方法来检验他的说法


这比你想象的要复杂一点

首先:对于每个用户,将转换为按用户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指出的错误,但结果将是垃圾