Postgresql-选择4天前的行
我在userBuyTable中有这些数据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
+-------+------------+
| 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;