我在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;
但是我根本没有得到预期的结果。
答案 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';
但是,如果您使用的是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';
答案 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