MYSQL: получить предыдущую строку, но на основе неосновного столбца - PullRequest
3 голосов
/ 07 мая 2019

У меня есть следующие данные в таблице MYSQL: активность

Идентификатор - основной столбец

TID не является первичным

ID          Name    TID

11145       Reg     111
14008       Inn     111
20246       Opp     111 <>
20250       Godk    111 <--
111450      Reg     222
140080      Inn     222
202460      Opp     222 <>
202500      Godk    222 <--

Мне нужно извлечь только предыдущую строку в строку, где Name = "Godk". Вы можете видеть, что предыдущий столбец не всегда primaryID-1, но может быть primaryid-n

Желаемые результаты :

20246       Opp     111
202460      Opp     222

Я пытался использовать следующее, но в духе

SELECT x.* , MAX(y.ID) as prev, 
FROM Activity x,  
INNER JOIN Activity y 
ON y.TID = x.TID
AND y.ID < x.ID 
where y.Name like '%Godk%'
GROUP 
 BY x.TID
 , x.ID; 

Но я не получаю ожидаемых результатов вообще.

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

Мы можем использовать коррелированный подзапрос для обработки этого:

SELECT
    ID,
    Name,
    TID
FROM Activity a1
WHERE
    (SELECT a2.Name FROM Activity a2
     WHERE a1.TID = a2.TID AND
           a2.ID > a1.ID
     ORDER BY a2.ID
     LIMIT 1) = 'Godk';

Демо

Но если вы используете MySQL 8+,тогда аналитическая функция LEAD - это гораздо более чистый путь:

WITH cte AS (
    SELECT ID, Name, TID,
        LEAD(Name, 1) OVER (PARTITION BY TID ORDER BY ID) AS lead_name
    FROM Activity
)

SELECT ID, Name, TID
FROM cte
WHERE lead_name = 'Godk';

Демо

0 голосов
/ 07 мая 2019

Я полагаю, что в вашем решении только небольшие ошибки

SELECT MAX(y.ID) as prev, y.TID
FROM Activity x
INNER JOIN Activity y ON y.TID = x.TID AND y.ID < x.ID 
WHERE x.Name like '%Godk%'
GROUP BY y.TID

Однако это решение не содержит атрибута Name.Если вам нужен результат, используйте для этого другое соединение.

SELECT a.ID, a.name, a.TID
FROM Activity a
JOIN (
    SELECT MAX(y.ID) as id, y.TID
    FROM Activity x
    INNER JOIN Activity y ON y.TID = x.TID AND y.ID < x.ID 
    WHERE x.Name like '%Godk%'
    GROUP BY y.TID
) t ON a.TID = t.TID and 
       a.ID = t.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...