如何在条件是特定日期差异的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 列之间日期差异的计数(值的分布)?

在 SQL 中选择日期之间的平均差异

SQL Row_Number() 不排序日期

如何在mongoDB中获取日期差异?日期应该是天数的差异?

如何查询两个不同日期的 Google Analytics 条件?

如何在 SQL 中获取记录删除日期?