add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE data_meaareport (
personid INT NULL,
leftresult INT NULL,
rightresult INT NULL,
bestear INT NULL,
recordid INT NOT NULL
);
INSERT INTO data_meaareport VALUES
(33122,1,1,0,2), (33122,6,7,0,1),
(41228,1,1,0,3), (41228,1,8,0,2),
(41228,6,7,0,1), (45336,1,1,0,3),
(45336,Null,8,1,2), (45336,1,1,0,1),
(54122,NULL,2,1,2), (54122,6,6,0,1),
(371339,2,2,0,4), (371339,NULL,2,1,3),
(371339,3,3,0,2), (371339,3,3,0,1);

SELECT *
FROM data_meaareport
order by personid, recordid desc;
Records: 14  Duplicates: 0  Warnings: 0
personid leftresult rightresult bestear recordid
33122 1 1 0 2
33122 6 7 0 1
41228 1 1 0 3
41228 1 8 0 2
41228 6 7 0 1
45336 1 1 0 3
45336 null 8 1 2
45336 1 1 0 1
54122 null 2 1 2
54122 6 6 0 1
371339 2 2 0 4
371339 null 2 1 3
371339 3 3 0 2
371339 3 3 0 1
WITH cte AS (
SELECT personid, MAX(recordid) mxr
FROM data_meaareport
GROUP BY personid)
SELECT mlr.personid, mxr,
CASE WHEN rightresult IN (1,2,12) THEN 999
WHEN mlr.recordid BETWEEN mxr-1 AND mxr+1 AND rightresult IS NULL THEN 0
WHEN mlr.recordid BETWEEN mxr-1 AND mxr+1 THEN rightresult
ELSE rightresult
END rr
FROM data_meaareport mlr
JOIN cte
ON mlr.personid=cte.personid
personid mxr rr
33122 2 999
33122 2 7
41228 3 999
41228 3 8
41228 3 7
45336 3 999
45336 3 8
45336 3 999
54122 2 999
54122 2 6
371339 4 999
371339 4 999
371339 4 3
371339 4 3
WITH cte AS (
SELECT personid, MAX(recordid) mxr
FROM data_meaareport
GROUP BY personid),
cte2 AS (
SELECT mlr.personid, mxr,
GROUP_CONCAT(IFNULL(leftresult,'NULL')
ORDER BY CASE WHEN leftresult IN (1,2,12) THEN 999
WHEN mlr.recordid BETWEEN mxr-1 AND mxr+1 AND leftresult IS NULL THEN 0
ELSE leftresult
END) lr,
GROUP_CONCAT(IFNULL(rightresult,'NULL')
ORDER BY CASE WHEN rightresult IN (1,2,12) THEN 999
WHEN mlr.recordid BETWEEN mxr-1 AND mxr+1 AND rightresult IS NULL THEN 0
WHEN mlr.recordid BETWEEN mxr-1 AND mxr+1 THEN 1
ELSE 2
END) rr
FROM data_meaareport mlr
JOIN cte
ON mlr.personid=cte.personid
GROUP BY mlr.personid, mxr)
SELECT *,
SUBSTRING_INDEX(lr,',',1) AS fleftresult,
SUBSTRING_INDEX(rr,',',1) AS frightresult
FROM cte2;
personid mxr lr rr fleftresult frightresult
33122 2 6,1 7,1 6 7
41228 3 6,1,1 8,7,1 6 8
45336 3 NULL,1,1 8,1,1 NULL 8
54122 2 NULL,6 6,2 NULL 6
371339 4 NULL,3,3,2 3,3,2,2 NULL 3
WITH cte AS (
SELECT personid, MAX(recordid) mxr
FROM data_meaareport
GROUP BY personid),
cte2 AS (
SELECT mlr.personid, mxr,
GROUP_CONCAT(IFNULL(leftresult,'NULL')
ORDER BY CASE WHEN leftresult IN (1,2,12) THEN 999
WHEN mlr.recordid BETWEEN mxr-1 AND mxr+1 AND leftresult IS NULL THEN 0
ELSE leftresult
END) lr,
GROUP_CONCAT(IFNULL(rightresult,'NULL')
ORDER BY CASE WHEN rightresult IN (1,2,12) THEN 999
WHEN mlr.recordid BETWEEN mxr-1 AND mxr+1 AND rightresult IS NULL THEN 0
WHEN mlr.recordid BETWEEN mxr-1 AND mxr+1 THEN 1
ELSE 2
END) rr
FROM data_meaareport mlr
JOIN cte
ON mlr.personid=cte.personid
GROUP BY mlr.personid, mxr)
SELECT personid,
SUBSTRING_INDEX(lr,',',1) AS fleftresult,
SUBSTRING_INDEX(rr,',',1) AS frightresult,
mxr AS mrecordid
FROM cte2;

personid fleftresult frightresult mrecordid
33122 6 7 2
41228 6 8 3
45336 NULL 8 3
54122 NULL 6 2
371339 NULL 3 4
WITH cte AS (
SELECT personid pid, MAX(recordid) mxr
FROM data_meaareport
GROUP BY personid)
SELECT *,
LEAD(leftresult) OVER
(PARTITION BY personid
ORDER BY IFNULL(leftresult,0),
CASE WHEN leftresult IN (1,2,12) THEN 999 END) AS lr,
LAG(rightresult) OVER (PARTITION BY personid
ORDER BY CASE WHEN rightresult IN (1,2,12) THEN 999
WHEN mlr.recordid BETWEEN mxr-1 AND mxr+1 AND rightresult IS NULL THEN 0
WHEN mlr.recordid BETWEEN mxr-1 AND mxr+1 THEN 1
ELSE 2
END) AS rr,
MAX(recordid) OVER (PARTITION BY personid) AS ltrcd
FROM data_meaareport mlr
JOIN cte
ON mlr.personid=cte.pid
ORDER BY personid, recordid DESC
personid leftresult rightresult bestear recordid pid mxr lr rr ltrcd
33122 1 1 0 2 33122 2 6 7 2
33122 6 7 0 1 33122 2 null null 2
41228 1 1 0 3 41228 3 1 7 3
41228 1 8 0 2 41228 3 6 null 3
41228 6 7 0 1 41228 3 null 8 3
45336 1 1 0 3 45336 3 1 8 3
45336 null 8 1 2 45336 3 1 null 3
45336 1 1 0 1 45336 3 null 1 3
54122 null 2 1 2 54122 2 6 6 2
54122 6 6 0 1 54122 2 null null 2
371339 2 2 0 4 371339 4 3 2 4
371339 null 2 1 3 371339 4 2 3 4
371339 3 3 0 2 371339 4 3 null 4
371339 3 3 0 1 371339 4 null 3 4
WITH cte AS
(SELECT *,
LEAD(leftresult) OVER (PARTITION BY personid ORDER BY IFNULL(leftresult,0)) AS lr,
LAG(rightresult) OVER (PARTITION BY personid) AS rr,
MAX(recordid) OVER (PARTITION BY personid) AS ltrcd
FROM data_meaareport mlr)
SELECT *,
(SELECT lr FROM cte c1 WHERE cte.personid=c1.personid AND c1.lr NOT IN (1,2,12))
FROM cte


WITH cte AS
(SELECT *,
LAG(leftresult) OVER (PARTITION BY personid
ORDER BY CASE WHEN leftresult NOT IN (1,2,12) THEN 1
WHEN leftresult IS NULL THEN 0 ELSE 999 END) AS lr,
LAG(rightresult) OVER (PARTITION BY personid
ORDER BY CASE WHEN rightresult NOT IN (1,2,12) THEN 1
WHEN rightresult IS NULL THEN 0 ELSE 999 END) AS rr,
ROW_NUMBER() OVER
(PARTITION BY personid ORDER BY personid, recordid DESC) AS rn
FROM data_meaareport mlr
ORDER BY personid, recordid DESC)
SELECT *
FROM cte
WHERE rn=1
personid leftresult rightresult bestear recordid lr rr rn
33122 1 1 0 2 6 7 1
41228 1 1 0 3 6 8 1
45336 1 1 0 3 null 8 1
54122 null 2 1 2 null 6 1
371339 2 2 0 4 3 2 1
WITH cte AS
(SELECT *,
LAG(leftresult) OVER (PARTITION BY personid
ORDER BY CASE WHEN leftresult NOT IN (1,2,12) THEN leftresult
WHEN leftresult IS NULL THEN 0 ELSE 999 END) AS lr,
LAG(rightresult) OVER (PARTITION BY personid
ORDER BY CASE WHEN rightresult NOT IN (1,2,12) THEN rightresult
WHEN rightresult IS NULL THEN 0 ELSE 999 END) AS rr,
ROW_NUMBER() OVER
(PARTITION BY personid ORDER BY personid, recordid DESC) AS rn
FROM data_meaareport mlr
ORDER BY personid, recordid DESC)
SELECT *
FROM data_meaareport mr
LEFT JOIN cte
ON mr.personid=cte.personid
AND rn=1
personid leftresult rightresult bestear recordid personid leftresult rightresult bestear recordid lr rr rn
33122 1 1 0 2 33122 1 1 0 2 6 7 1
33122 6 7 0 1 33122 1 1 0 2 6 7 1
41228 1 1 0 3 41228 1 1 0 3 6 8 1
41228 1 8 0 2 41228 1 1 0 3 6 8 1
41228 6 7 0 1 41228 1 1 0 3 6 8 1
45336 1 1 0 3 45336 1 1 0 3 null 8 1
45336 null 8 1 2 45336 1 1 0 3 null 8 1
45336 1 1 0 1 45336 1 1 0 3 null 8 1
54122 null 2 1 2 54122 null 2 1 2 null 6 1
54122 6 6 0 1 54122 null 2 1 2 null 6 1
371339 2 2 0 4 371339 2 2 0 4 3 2 1
371339 null 2 1 3 371339 2 2 0 4 3 2 1
371339 3 3 0 2 371339 2 2 0 4 3 2 1
371339 3 3 0 1 371339 2 2 0 4 3 2 1
select m1.personid,m1.leftresult,m1.rightresult,m1.bestear,m1.ascrnk,
case when m1.leftresult in (1,2,12) then
(select m2.leftresult from MR m2 where m1.personid = m2.personid and m2.ascrnk = m1.ascrnk -1) end leftlagg
from MR m1
order by m1.personid asc, m1.ascrnk desc
Table 'fiddle.MR' doesn't exist