[英]Compare current row value with previous row values in loop in SQL
I have a table with fields - A (ID), B (Flag).我有一个包含字段的表 - A(ID),B(标志)。 I need to add a new column - C (Result) in this table and it's value will be derived based on B (Flag) field.
我需要在此表中添加一个新列 - C(结果),其值将基于 B(标志)字段得出。 If flag is false then keep checking previous rows till we get flag as true and then take value of A (ID) field and populate it in C (Result) column.
如果 flag 为 false,则继续检查之前的行,直到我们将 flag 设为 true,然后取 A(ID)字段的值并将其填充到 C(结果)列中。 So C will have the last value of A with B field as True.
所以 C 的 A 和 B 字段的最后一个值为 True。
A![]() |
B![]() |
C ![]() |
---|---|---|
1 ![]() |
T![]() |
1 ![]() |
2 ![]() |
F ![]() |
1 ![]() |
3 ![]() |
F ![]() |
1 ![]() |
4 ![]() |
T![]() |
4 ![]() |
5 ![]() |
T![]() |
5 ![]() |
6 ![]() |
F ![]() |
5 ![]() |
7 ![]() |
T![]() |
7 ![]() |
8 ![]() |
F ![]() |
7 ![]() |
9 ![]() |
F ![]() |
7 ![]() |
10 ![]() |
F ![]() |
7 ![]() |
11 ![]() |
T![]() |
11 ![]() |
WITH
cte1 AS (
SELECT A, SUM(B='T') OVER (ORDER BY A) group_no
FROM test
),
cte2 AS (
SELECT A, MIN(A) OVER (PARTITION BY group_no) previous_T
FROM cte1
)
UPDATE test
JOIN cte2 USING (A)
SET test.C = cte2.previous_T;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=46c1edfbc42e331f9bb39a36ea71e905 https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=46c1edfbc42e331f9bb39a36ea71e905
In MySQL 5.x use在 MySQL 5.x 中使用
UPDATE test
JOIN (
SELECT A,
@tmp := CASE WHEN B='T' THEN A ELSE @tmp END C
FROM test
JOIN (SELECT @tmp:=0) init
ORDER BY A
) data USING (A)
SET test.C = data.C;
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=3f341b98b768c2a2369b5d814453b234 https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=3f341b98b768c2a2369b5d814453b234
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.