Postgresql-选择4天前的行

Postgresql-选择4天前的行,sql,postgresql,Sql,Postgresql,我在userBuyTable中有这些数据 +-------+------------+ | ID | Date | +-------+------------+ | 11111 | 2019-11-02 | | 11111 | 2019-11-05 | | 22222 | 2019-11-22 | | 33333 | 2019-11-22 | | 33333 | 2019-11-23 | +-------+------------+ 我想在这样的情况下在4天前找到有数据的I

我在userBuyTable中有这些数据

+-------+------------+
|  ID   |    Date    |
+-------+------------+
| 11111 | 2019-11-02 |
| 11111 | 2019-11-05 |
| 22222 | 2019-11-22 |
| 33333 | 2019-11-22 |
| 33333 | 2019-11-23 |
+-------+------------+ 
我想在这样的情况下在4天前找到有数据的ID

+-------+------------+
|  ID   |    Date    |
+-------+------------+
| 11111 | 2019-11-02 |
| 11111 | 2019-11-05 |
+-------+------------+
2019-11-05-2019-11-02=3

+-------+------------+
|  ID   |    Date    |
+-------+------------+
| 33333 | 2019-11-22 |
| 33333 | 2019-11-23 |
+-------+------------+
2019-11-23-2019-11-22=1

这是预期的结果

+-------+------------+
|  ID   |    Date    |
+-------+------------+
| 11111 | 2019-11-05 |
| 33333 | 2019-11-23 |
+-------+------------+
我试着选择

select 
ID
,(select ID from userBuyTable ubtIn where ubtIn.ID = ubt.ID and (ubt.Date - ubtIn.Date)<4 ) 
from userBuyTable ubt where ubt.Date between '2019-11-01' and '2019-11-30'
存在着:

看。 结果:

存在着:

看。 结果:

如果需要原始行,我只需使用滞后和超前:

select ubt.*
from (select ubt.*,
             lag(date) over (partition by id order by date) as prev_date,
             lead(date) over (partition by id order by date) as next_date
      from userBuyTable ubt
     ) ubt
where (prev_date > date - 4 * interval '1 day') or
      (next_date < date + 4 * interval '1 day');
或:

如果需要原始行,我只需使用滞后和超前:

select ubt.*
from (select ubt.*,
             lag(date) over (partition by id order by date) as prev_date,
             lead(date) over (partition by id order by date) as next_date
      from userBuyTable ubt
     ) ubt
where (prev_date > date - 4 * interval '1 day') or
      (next_date < date + 4 * interval '1 day');
或:


是否应将每个日期与所有其他行进行比较?是与所有其他行进行比较是否应将每个日期与所有其他行进行比较?是与所有其他行进行比较
| ID    | Date       |
| ----- | ---------- |
| 11111 | 2019-11-05 |
| 33333 | 2019-11-23 |  
select ubt.*
from (select ubt.*,
             lag(date) over (partition by id order by date) as prev_date,
             lead(date) over (partition by id order by date) as next_date
      from userBuyTable ubt
     ) ubt
where (prev_date > date - 4 * interval '1 day') or
      (next_date < date + 4 * interval '1 day');
select ubt.*
from (select ubt.*,
             lag(date) over (partition by id order by date) as prev_date
      from userBuyTable ubt
     ) ubt
where prev_date > date - 4 * interval '1 day';
select ubt.id, max(ubt.date)
from userBuyTable ubt
where exists (select 1
              from userBuyTable ubt2
              where ubt2.id = ubt.id and ubt2.date > date - 4 * interval '1 day'
             )
group by ubt.id;