首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgresql -选择4天前的行

Postgresql -选择4天前的行
EN

Stack Overflow用户
提问于 2019-12-25 16:34:03
回答 2查看 82关注 0票数 0

我在userBuyTable中有这个数据

代码语言:javascript
复制
+-------+------------+
|  ID   |    Date    |
+-------+------------+
| 11111 | 2019-11-02 |
| 11111 | 2019-11-05 |
| 22222 | 2019-11-22 |
| 33333 | 2019-11-22 |
| 33333 | 2019-11-23 |
+-------+------------+ 

我想知道像这样4天前有数据的ID在哪里

代码语言:javascript
复制
+-------+------------+
|  ID   |    Date    |
+-------+------------+
| 11111 | 2019-11-02 |
| 11111 | 2019-11-05 |
+-------+------------+

(2019-11-05 - 2019-11-02) =3

代码语言:javascript
复制
+-------+------------+
|  ID   |    Date    |
+-------+------------+
| 33333 | 2019-11-22 |
| 33333 | 2019-11-23 |
+-------+------------+

(2019-11-23 - 2019-11-22 )=1

这是意料之中的结果

代码语言:javascript
复制
+-------+------------+
|  ID   |    Date    |
+-------+------------+
| 11111 | 2019-11-05 |
| 33333 | 2019-11-23 |
+-------+------------+

我试着选择

代码语言:javascript
复制
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'
EN

回答 2

Stack Overflow用户

发布于 2019-12-25 17:23:34

使用EXISTS

代码语言:javascript
复制
select u.* from userBuyTable u
where u."Date" between '2019-11-01' and '2019-11-30'
and exists (
  select 1 from userBuyTable
  where u."Date" > "Date" and u."Date" - "Date" < 4 
) 

请参阅demo

如果您只对具有相同ID的行感兴趣,则使用以下命令:

代码语言:javascript
复制
select u.* from userBuyTable u
where u."Date" between '2019-11-01' and '2019-11-30'
and exists (
  select 1 from userBuyTable
  where u."ID" = "ID" and u."Date" > "Date" and u."Date" - "Date" < 4 
)

请参阅demo

结果:

代码语言:javascript
复制
| ID    | Date       |
| ----- | ---------- |
| 11111 | 2019-11-05 |
| 33333 | 2019-11-23 |  
票数 1
EN

Stack Overflow用户

发布于 2019-12-25 21:28:42

如果需要原始行,我可以简单地使用lag()lead()

代码语言:javascript
复制
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');

如果您只需要与条件匹配的最新行,则:

代码语言:javascript
复制
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';

或者:

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59476588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档