ibeautiful
一种方法使用条件聚合:select p.created_date as date, min(p.created_time) as firstTime, max(p.created_time) as lastTime, max(case when seqnum = 1 then x end) as first_x, max(case when seqnum_desc = 1 then x end) as last_x,from (select p.*, row_number() over (partition by id order by created_time) as seqnum, row_number() over (partition by id order by created_time desc) as seqnum_desc from passes p ) pwhere p.id=1group by p.created_date;您还可以将条件聚合表述为: max(x) filter where (seqnum = 1) as first_x, max(x) filter where (seqnum_desc = 1) as last_x,另一种方法使用数组:select p.created_date as date, min(p.created_time) as firstTime, max(p.created_time) as lastTime,) (array_agg(p.x order by p.created_date asc))[1] as first_x, (array_agg(p.x order by p.created_date desc))[1] as last_xfrom passes pwhere p.id = 1group by p.created_date;
jeck猫
我能够通过创建子查询来重现您的结果。子查询按日期对值进行分组并返回第一次和最后一次。通过确定第一次和最后一次的日期,我做了两次连接,一次是为了获取第一个 X,另一个是为了获取最后一个 X。通过使用 mySQL 作为引擎,我在http://sqlfiddle.com/上执行了以下步骤:构建架构:CREATE TABLE passes (`id` int, `u_id` int, `date` int, `time` int, `x` int);INSERT INTO passes (`id`, `u_id`, `date`, `time`, `x`)VALUES (1, 1, 20200806, 0900, 60), (2, 2, 20200806, 0905, 60), (3, 3, 20200806, 0910, 61), (4, 1, 20200806, 1015, 62), (5, 1, 20200806, 1830, 61), (6, 3, 20200807, 0915, 61), (7, 1, 20200807, 0920, 62), (8, 2, 20200807, 1820, 63), (9, 1, 20200807, 1835, 59);MySQL 查询:Select SUB1.TheDate,SUB1.firstTime,x1.x as firstX,SUB1.lastTime,x2.x as lastX from (select passes.date as TheDate, min(passes.time) as firstTime, max(passes.time) as lastTimefrom passeswhere passes.u_id = 1group by passes.date) AS SUB1join passes as x1 on x1.date = SUB1.TheDateand x1.time = SUB1.firstTimejoin passes as x2 on x2.date = SUB1.TheDateand x2.time = SUB1.lastTime结果如下:TheDate firstTime firstX lastTime lastX20200806 900 60 1830 6120200807 920 62 1835 59