如何在sql中基于两个日期提取数据

cbwuti44  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(465)

只需要显示在上一个请求id过期后创建的记录。
https://i.stack.imgur.com/jum97.png
Jmeter 板-

  1. REQUEST_ID CREATED_DATE EXPIRY_DATE
  2. 1 2020-06-02 2020-06-06
  3. 2 2020-06-04 2020-06-10
  4. 3 2020-06-08 2020-06-12
  5. 4 2020-06-09 2020-06-16
  6. 5 2020-06-09 2020-06-15
  7. 6 2020-06-18 2020-06-20
  8. 7 2020-06-21 2020-06-25

o/p-

  1. REQUEST_ID CREATED_DATE EXPIRY_DATE
  2. 1 2020-06-02 2020-06-06
  3. 3 2020-06-08 2020-06-12
  4. 6 2020-06-18 2020-06-20
  5. 7 2020-06-21 2020-06-25
q8l4jmvw

q8l4jmvw1#

如果您运行的是mysql 8.0,则可以使用窗口函数:

  1. select request, created_at, expiry_date
  2. from (
  3. select
  4. t.*,
  5. lag(expiry_date) over(order by request) lag_expiry_date
  6. from mytable t
  7. ) t
  8. where lag_expiry_date is date or created_at > lag_expiry_date

另一方面,如果您想根据与上一个有效记录的差异以增量方式选择记录,那么就要复杂一些。您需要某种迭代过程,它建议使用递归查询。基本上,您可以用 row_number() ,然后逐一处理,决定保留哪一个。

  1. with recursive
  2. data as (
  3. select t.*, row_number() over(order by created_date) rn from mytable t
  4. ),
  5. cte as (
  6. select d.*, 1 to_keep, expiry_date last_expiry_date
  7. from data d
  8. where rn = 1
  9. union all
  10. select
  11. d.*,
  12. (d.created_date > c.last_expiry_date),
  13. case when d.created_date > c.last_expiry_date
  14. then d.expiry_date
  15. else c.last_expiry_date
  16. end
  17. from cte c
  18. inner join data d on d.rn = c.rn + 1
  19. )
  20. select request_id, created_date, expiry_date
  21. from cte
  22. where to_keep
  23. order by rn

db小提琴演示:

  1. | request_id | created_date | expiry_date |
  2. | ---------- | ------------ | ----------- |
  3. | 1 | 2020-06-02 | 2020-06-06 |
  4. | 3 | 2020-06-08 | 2020-06-12 |
  5. | 6 | 2020-06-18 | 2020-06-20 |
  6. | 7 | 2020-06-21 | 2020-06-25 |
展开查看全部

相关问题