使用来自另一个 table 行的最大匹配项更新行
Update rows with max matches from rows of another table
我在 8mln
行周围有 table1
并且想在搜索 tale2
中的每一行后用最大匹配更新列 status
(基于 rows from table2
)
的最大匹配
示例table1
:
ID | a | b | c | d | e | f | g | grade | status |
---------------------------------------------------------------
01 | 100 | 101 | 105 | 108 | 110 | 126 | 188 | x | |
示例 table2
(大约 100k
行):
a | b | c | d | e | f | g |
----------------------------------------
75 | 101 |106 | 107 |110 | 122 | 188 |
100 | 104 |105 | 110 |114 | 126 | 188 |
95 | 100 |105 | 108 |126 | 207 | 285 |
基于以上示例,结果将为 5 因为;
- 从第 1 行
3
匹配 [101, 110, 188]
- 从第 2 行
5
匹配 [100, 105, 110, 126, 188]
- 从第 3 行
4
匹配 [100, 105, 108, 126]
所以 maximum/highest 匹配是 5 来自 table2
中的 second row
更新 table1
列后的示例 status
:
ID | a | b | c | d | e | f | g | grade | status |
---------------------------------------------------------------
01 | 100 | 101 | 105 | 108 | 110 | 126 | 188 | x | 5 |
我正在使用此处显示的脚本,但更新整个报告需要很长时间,而且结果也不准确。
所以,如果有人可以通过减少查询的执行时间
来提供替代/更好的option/script,我将不胜感激
UPDATE public.table1 AS t1 SET status =
(SELECT MAX(tmp.mtch) FROM
(SELECT (SELECT CASE WHEN t1.a=t2.a THEN 1 ELSE 0 END) +
(SELECT CASE WHEN t1.b=t2.b THEN 1 ELSE 0 END) +
(SELECT CASE WHEN t1.c=t2.c THEN 1 ELSE 0 END) +
(SELECT CASE WHEN t1.d=t2.d THEN 1 ELSE 0 END) +
(SELECT CASE WHEN t1.e=t2.e THEN 1 ELSE 0 END) +
(SELECT CASE WHEN t1.f=t2.f THEN 1 ELSE 0 END) +
(SELECT CASE WHEN t1.g=t2.g THEN 1 ELSE 0 END)
AS mtch FROM public.table2 AS t2 ) AS tmp );
我认为下面的查询应该适合你 -
UPDATE public.table1 AS t1 SET status =
(SELECT MAX(tmp.mtch)
FROM (SELECT SUM(CASE WHEN t1.a IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
SUM(CASE WHEN t1.b IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
SUM(CASE WHEN t1.c IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
SUM(CASE WHEN t1.d IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
SUM(CASE WHEN t1.e IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
SUM(CASE WHEN t1.f IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
SUM(CASE WHEN t1.g IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
AS mtch
FROM public.table2 AS t2 ) AS tmp )
WHERE t1.grade>0;
我在 8mln
行周围有 table1
并且想在搜索 tale2
中的每一行后用最大匹配更新列 status
(基于 rows from table2
)
示例table1
:
ID | a | b | c | d | e | f | g | grade | status |
---------------------------------------------------------------
01 | 100 | 101 | 105 | 108 | 110 | 126 | 188 | x | |
示例 table2
(大约 100k
行):
a | b | c | d | e | f | g |
----------------------------------------
75 | 101 |106 | 107 |110 | 122 | 188 |
100 | 104 |105 | 110 |114 | 126 | 188 |
95 | 100 |105 | 108 |126 | 207 | 285 |
基于以上示例,结果将为 5 因为;
- 从第 1 行
3
匹配 [101, 110, 188] - 从第 2 行
5
匹配 [100, 105, 110, 126, 188] - 从第 3 行
4
匹配 [100, 105, 108, 126]
所以 maximum/highest 匹配是 5 来自 table2
second row
更新 table1
列后的示例 status
:
ID | a | b | c | d | e | f | g | grade | status |
---------------------------------------------------------------
01 | 100 | 101 | 105 | 108 | 110 | 126 | 188 | x | 5 |
我正在使用此处显示的脚本,但更新整个报告需要很长时间,而且结果也不准确。
所以,如果有人可以通过减少查询的执行时间
UPDATE public.table1 AS t1 SET status =
(SELECT MAX(tmp.mtch) FROM
(SELECT (SELECT CASE WHEN t1.a=t2.a THEN 1 ELSE 0 END) +
(SELECT CASE WHEN t1.b=t2.b THEN 1 ELSE 0 END) +
(SELECT CASE WHEN t1.c=t2.c THEN 1 ELSE 0 END) +
(SELECT CASE WHEN t1.d=t2.d THEN 1 ELSE 0 END) +
(SELECT CASE WHEN t1.e=t2.e THEN 1 ELSE 0 END) +
(SELECT CASE WHEN t1.f=t2.f THEN 1 ELSE 0 END) +
(SELECT CASE WHEN t1.g=t2.g THEN 1 ELSE 0 END)
AS mtch FROM public.table2 AS t2 ) AS tmp );
我认为下面的查询应该适合你 -
UPDATE public.table1 AS t1 SET status =
(SELECT MAX(tmp.mtch)
FROM (SELECT SUM(CASE WHEN t1.a IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
SUM(CASE WHEN t1.b IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
SUM(CASE WHEN t1.c IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
SUM(CASE WHEN t1.d IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
SUM(CASE WHEN t1.e IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
SUM(CASE WHEN t1.f IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
SUM(CASE WHEN t1.g IN (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f, t2.g) THEN 1 ELSE 0 END) +
AS mtch
FROM public.table2 AS t2 ) AS tmp )
WHERE t1.grade>0;