根据日期在特定范围内进行匹配

问题描述 投票:0回答:1

我有下表称为 t1

a b c d e f g h j 日期 结果
20 2 2 2 4 24 0 0 2 3 2023-01-01
13 2 2 222 2 24 2 1 2 3 2023-01-02
15 2 2 3 3 21 0 0 0 22 2023-01-03
15 2 2 3 3 21 0 0 0 22 2023-01-04
18 2 2 3 4 20 2 1 2 32 2023-01-05
24 2 2 222 3 20 22 2 2 2 2023-01-06
8 2 0 3 3 22 2 1 0 2 2023-01-07
18 2 2 0 4 24 0 0 0 3 2023-01-08
22 2 0 0 4 20 0 0 2 3 2023-01-09
24 2 0 0 5 21 0 0 3 2 2023-01-10

尝试连接两列(例如 e 和 f),然后根据日期列检查此连接值是否与前四行中的任何值匹配。

例如,基于“2023-01-09”的 CONCAT(e,f) 等于“4,20”并检查前 4 个日期(2023-01-08、2023-01-07)内的“4,20” , 2023-01-06, 2023-01-05), 有一个基于 2023-01-05 的匹配

尝试使用下面的代码,但结果是错误的,因为代码仅检查最早的 4 个日期内

UPDATE t1 
SET sesult = (case        
       WHEN 
            CONCAT(e,f) in(select CONCAT(e,f) from t1 order by date ASC limit 4)   
      THEN 0 ELSE 1 END)

结果如下

a b c d e f g h j 日期 结果
20 2 2 2 4 24 0 0 2 3 2023-01-01 0
13 2 2 222 2 24 2 1 2 3 2023-01-02 0
15 2 2 3 3 21 0 0 0 22 2023-01-03 0
15 2 2 3 3 21 0 0 0 22 2023-01-04 1
18 2 2 3 4 20 2 1 2 32 2023-01-05 0
24 2 2 222 3 20 22 2 2 2 2023-01-06 0
8 2 0 3 3 22 2 1 0 2 2023-01-07 0
18 2 2 0 4 24 0 0 0 3 2023-01-08 0
22 2 0 0 4 20 0 0 2 3 2023-01-09 1
24 2 0 0 5 21 0 0 3 2 2023-01-10 0
postgresql match case
1个回答
0
投票

假设

date
是表格的
PRIMARY KEY

您可以使用

array_agg()
作为具有自定义窗口框架的窗口函数来构建匿名复合类型数组,然后与
ANY
构造进行比较。

基本查询:

SELECT e, f, date
     ,                 array_agg(ROW(e,f)) OVER (ORDER BY date ROWS BETWEEN 4 PRECEDING AND 1 PRECEDING) AS past_4_rows
     , ROW(e,f) = ANY (array_agg(ROW(e,f)) OVER (ORDER BY date ROWS BETWEEN 4 PRECEDING AND 1 PRECEDING)) AS match
FROM   t1;

更新:

UPDATE t1
SET    result = COALESCE(r.match, false)
FROM  (
   SELECT date
        , (e,f) = ANY (array_agg((e,f)) OVER (ORDER BY date ROWS BETWEEN 4 PRECEDING AND 1 PRECEDING)) AS match
   FROM   t1
   ) r
WHERE  t1.date = r.date;

小提琴

相关:

© www.soinside.com 2019 - 2024. All rights reserved.