在现在和下个月之间的日期间隔中检查条件

时间:2018-07-30 23:49:33

标签: postgresql

我在PostgreSQL 10中有一张桌子。该表具有以下结构

| date | entity | col1 | col2 |
|------+--------+------+------|

每一行都代表一个实体在给定日期发生的事件。该事件具有由col1col2表示的属性。

我想添加一个新列,以指示相对于当前行是否存在其中事件col2满足给定条件(在以下示例中,条件为col2 > 20)的事件给定的时间间隔(例如1 month)。

| date | entity | col1 | col2 | fulfill |
|------+--------+------+------+---------|
| t1   |   A    |  a1  |  10  |   F     |
| t1   |   B    |  b   |   9  |   F     |
| t2   |   A    |  a2  |  10  |   T     |
| t3   |   A    |  a3  |  25  |   F     |
| t3   |   B    |  b2  |   8  |   F     |

t3t2 + interval 1 month中的日期。

最有效的方法是什么?

1 个答案:

答案 0 :(得分:1)

我不确定我是否正确解决了您的问题。我的情况是“如果现在到下个月之间的值> = 10,则为T”

我有以下数据:

val  event_date  
---  ----------  
22   2016-12-31  -- should be T because val >= 10
8    2017-03-20  -- should be F because in [event_date, eventdate + 1 month no val >= 10]
6    2017-03-22  -- F
42   2017-12-31  -- T because there are 2 values >= 10 in next month
25   2018-01-24  -- T val >= 10
9    2018-02-11  -- F
1    2018-03-01  -- T because in month there is 1 val >= 10
2    2018-03-10  -- T same
20   2018-04-01  -- T
7    2018-04-01  -- T because an same day val >= 10
1    2018-07-24  -- F
22   2019-01-01  -- T
4    2020-10-22  -- T
123  2020-11-04  -- T

查询:

SELECT DISTINCT
    e1.val,
    e1.event_date,
    CASE
        WHEN MAX(e2.val) over (partition BY e1.event_date) >= 10
        THEN 'T'
        ELSE 'F'
    END AS fulfilled
FROM
    testdata.events e1
JOIN
    testdata.events e2
ON
    e1.event_date <= e2.event_date
AND e2.event_date <=(e1.event_date + interval '1 month') ::DATE
ORDER BY
    e1.event_date

结果:

val  event_date  fulfilled  
---  ----------  ---------  
22   2016-12-31  T          
8    2017-03-20  F          
6    2017-03-22  F          
42   2017-12-31  T          
25   2018-01-24  T          
9    2018-02-11  F          
1    2018-03-01  T          
2    2018-03-10  T          
20   2018-04-01  T          
7    2018-04-01  T          
1    2018-07-24  F          
22   2019-01-01  T          
4    2020-10-22  T          
123  2020-11-04  T   

目前,如果没有加入同一张桌子的话,我找不到解决方案。这对我来说似乎不是很时尚。