如何在条件是特定日期差异的sql中获取row_numbers?
Posted
技术标签:
【中文标题】如何在条件是特定日期差异的sql中获取row_numbers?【英文标题】:How to get the row_numbers in sql where condition is a specific date difference? 【发布时间】:2018-04-18 07:50:03 【问题描述】:我在查询的一部分中无法提取日期差至少为三个月的 row_numbers。因此,在下面的示例中,我想提取 row_number 1(始终是第一个)、5 和 6。因此,在 row_number 1 之后, date_diff > 3 个月的 row_numbers (并且在第二个提取的 row_number 之后再次应用此条件直到无。是否存在SQL 中的任何函数或方式都允许做出这样的条件?
table_name: users
id row_number User date
---|----------|-------|---------------------|
1 |1 | Usr1 | 2017-10-01 12:35:00 |
2 |2 | Usr1 | 2017-10-01 12:35:00 |
3 |3 | Usr1 | 2017-12-03 07:47:00 |
4 |4 | Usr1 | 2018-01-10 07:47:00 |
5 |5 | Usr1 | 2018-02-10 07:47:00 |
6 |6 | Usr1 | 2018-04-10 07:47:00 |
【问题讨论】:
【参考方案1】:你可以使用lag()
函数来计算差值:
select *
from (
select id, row_number, "User", date,
date - lag(date) over (order by id) as diff
from users
) t
where diff is null -- first row
or diff > interval '3 month';
【讨论】:
此任务的正确功能。感谢您的回复。【参考方案2】:我不确定您是否要将间隔作为月份进行比较。我认为它们通常表示为天数。
因此,我将其表述为:
select u.*
from (select u.*, lag(date) over (order by id) as prev_date
from users u
) u
where prev_date is null or prev_date < date - interval '3 month';
如果or
困扰您,您可以使用lag()
中的默认值将其删除:
select u.*
from (select u.*, lag(date, 1, date - interval '100 year') over (order by id) as prev_date
from users u
) u
where prev_date < date - interval '3 month';
【讨论】:
上述解决方案的不错变化。我必须提到我正在使用 Redshift,所以我不得不使用天而不是月。谢谢。 @Gamelogic 。 . .在 RedShift 中,您可以改用add_months()
。以上是关于如何在条件是特定日期差异的sql中获取row_numbers?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SQL 获取 2 列之间日期差异的计数(值的分布)?