【问题标题】:MySQL 5 : using a LAG / LEAD request without LAG / LEAD functionsMySQL 5:使用没有 LAG / LEAD 功能的 LAG / LEAD 请求
【发布时间】:2020-11-27 15:42:06
【问题描述】:

我在非常旧的版本 (MySQL 5) 上的 SQL 请求遇到问题。看来我的需求可以通过 LAG 和 LEAD 函数轻松满足,但它们在 MySQL 8 之前不存在,所以这不是一个选项......

所以这里有一组简化的数据:

CREATE TABLE Tickets (
    incrementalID integer,
    TicketNumber smallint,
    SupportGroup varchar(100)
);
 
INSERT INTO Tickets (incrementalID, TicketNumber, SupportGroup) VALUES 
(345678, 131, 'GSSbdd'),
(347681, 131, 'GSSmdw'),
(347682, 131, 'COPsn1'),
(347683, 131, 'COPsn1'),
(347684, 131, 'COPsn2'),
(342631, 198, 'VIReer'),
(347629, 227, 'LPOdfh'),
(350112, 299, 'COPmwn'),
(350113, 299, 'GSSgdf'),
(350119, 299, 'COPmwn'),
(346784, 714, 'LPOerz'),
(346871, 714, 'GSSwnt'),
(346872, 714, 'GSSunx'),
(346873, 714, 'GSSunx'),
(348931, 714, 'GSSwnt'),
(348941, 714, 'LPOefe'),
(401232, 714, 'LPOefe'),
(401233, 714, 'LPOefe'),
(412344, 714, 'LPOeze'),
(412345, 714, 'LPOeze'),
(416377, 714, 'GSSunx'),
(416378, 714, 'GSSmdw'),
(416379, 714, 'GSSgdf'),
(416380, 714, 'GSSgdf'),
(416381, 714, 'GSSgdf');

对于相同的 TicketsNumbers,我只需要选择“SupportGroup”字段从 GSS% 更改为 COP% 或 COP% 更改为 GSS% 的行

例如,对于 TicketNumber 131,我只想选择第 2 行和第 3 行,因为 SupportGroup 从 GSS% (GSSmdw) 更改为 COP% (COPsn1)。

我不想选择支持组在 GSS% 和另一个 GSS% 之间发生变化的行(例如在第 1 和 2 行中,例如 GSSbdd 到 GSSmdw)

所以最后,预期的结果是:

incrementalID   TicketNumber    SupportGroup
347681          131             GSSmdw
347682          131             COPsn1
350112          299             COPmwn
350113          299             GSSgdf
350119          299             COPmwn

对于信息,我的数据必须按 TicketNumber 排序,然后是 incrementalID,而且我没有数据库的写入权限,所以我只能读取 SQL 请求。

【问题讨论】:

    标签: mysql select request row


    【解决方案1】:

    一种方法是相关子查询。您可以使用重载的having 进行过滤:

    select t.*,
           (select t2.SupportGroup
            from tickets t2
            where t2.TicketNumber = t.TicketNumber and
                  t2.incrementalID < t.incrementalID
            order by t2.incrementalID desc
            limit 1
           ) as prev_SupportGroup,
           (select t2.SupportGroup
            from tickets t2
            where t2.TicketNumber = t.TicketNumber and
                  t2.incrementalID > t.incrementalID
            order by t2.incrementalID asc
            limit 1
           ) as next_SupportGroup
    from tickets t
    having (prev_SupportGroup like 'GSS%' and SupportGroup like 'COP%') or
           (SupportGroup like 'GSS%' and next_SupportGroup like 'COP%');       
    

    【讨论】:

      【解决方案2】:
      SELECT *
      FROM Tickets t1
      JOIN Tickets t2 ON t1.TicketNumber = t2.TicketNumber
      WHERE t1.incrementalID < t2.incrementalID
        AND NOT EXISTS ( SELECT NULL
                         FROM Tickets t3
                         WHERE t1.TicketNumber = t3.TicketNumber
                           AND t1.incrementalID < t3.incrementalID
                           AND t3.incrementalID < t2.incrementalID)
        AND (LEFT(t1.SupportGroup, 3), LEFT(t2.SupportGroup, 3)) IN (('COP', 'GSS'), ('GSS', 'COP'))
      

      fiddle

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多