加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

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

发布时间:2021-02-25 17:05:54 所属栏目:MySql教程 来源:网络整理
导读:我在MYSQL表中有以下数据:活动 ID为“主要”列 TID不是主要的 ID Name TID11145 Reg 11114008 Inn 11120246 Opp 111 20250 Godk 111 --111450 Reg 222140080 Inn 222202460 Opp 222 202500 Godk 222 -- 我只需要提取前一行到Name =“ Godk”的行即可.您可以

我在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; 

但是我根本没有得到预期的结果. 最佳答案 我们可以使用相关子查询来处理此问题:

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,TID,LEAD(Name,1) OVER (PARTITION BY TID ORDER BY ID) AS lead_name
    FROM Activity
)

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

Demo

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读