加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL – 对于列表中的每个ID,选择2个最后一个元素

发布时间:2020-12-11 23:39:08 所属栏目:MySql教程 来源:网络整理
导读:我有一个包含以下架构的表: id,field,time3,'test0',2012-08-293,'test1',2012-08-303,'test2',2012-08-312,2012-08-192,2012-08-202,2012-08-26... 我需要列表中的每个id找到它的最后一个值和前一个值. 例如,如果ids = [2,3],结果应该返回 3,2012-08-31 2,

我有一个包含以下架构的表:

id,field,time
3,'test0',2012-08-29
3,'test1',2012-08-30
3,'test2',2012-08-31
2,2012-08-19
2,2012-08-20
2,2012-08-26
...

我需要列表中的每个id找到它的最后一个值和前一个值.
例如,如果ids = [2,3],结果应该返回

3,2012-08-31 
2,2012-08-26

如果我需要最后一个值,我会用

SELECT *
FROM table
WHERE id IN (2,3)
GROUP BY id

我有什么想法可以达到这个目的吗? 最佳答案 如果每个ID号的时间都是唯一的,那么这将有效.

SELECT d.id,d.field,d.time
  FROM d d
  JOIN (
    SELECT max(d.time)m,d.id
      FROM d
      JOIN (
         SELECT max(time) m,id
           FROM d
       GROUP BY id
      )e ON d.id=e.id AND e.m>d.time
      GROUP BY d.id
   )e ON d.time >= e.m AND d.id = e.id

这是如何工作的.此嵌套查询获取每个id的最新时间.

         SELECT max(time) m,id
           FROM d
       GROUP BY id

然后,它会嵌入到此查询中,这将为您提供每个id的倒数第二个时间(排除最新时间的行子集的最新时间).

    SELECT max(d.time)m,id
           FROM d
       GROUP BY id
      )e ON d.id=e.id AND e.m > d.time

最后,完整查询(如上所示)获取所有行的次数大于或等于第二个最新时间.

如果您的时间不是唯一的 – 也就是说,您有一些行显示相同的ID和时间,则每个ID可能会有两行以上.但是你总会得到最近的两次.

如果某个特定ID只有一行,您将无法获得它.

只有你知道这些限制是否可以接受.

小提琴! http://sqlfiddle.com/#!2/82719/5/0

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读