MYSQL:获取上一行,但基于非主列

时间:2019-05-07 10:00:19

标签: mysql sql join union

我在MYSQL表中有以下数据:活动

ID是主要列

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 个答案:

答案 0 :(得分:2)

我们可以使用相关子查询来处理此问题:

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';

Demo

但是,如果您使用的是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';

Demo

答案 1 :(得分:0)

我相信您的解决方案中只有一些小错误

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