我有下表称为 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 |
假设
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;
相关: