В MYSQL - выберите до определенного значения в столбце - PullRequest
0 голосов
/ 25 октября 2018

Я искал решение в течение нескольких недель, но, тем не менее, не смог решить проблему: возможно ли выбрать только несколько строк до определенного значения или до определенного значения, которое могло бы повторяться далее в моей таблице?Я думаю, что пример может быть очень полезным:

Type |  OBID    | RECID
5    | T-000032 | 5637637  
1    | T-123456 | 5637636 
1    | T-789123 | 5637635  
2    | T-123456 | 5637634
2    | T-789123 | 5637633 
1    | T-221133 | 5637628 
2    | T-221133 | 5637612

Вот небольшой пример: этот раздел моей таблицы всегда начинается с Типа 5, за которым следует пара строк с Типом 1. Мне нужен только этот специальный«группа» строк с типом 1, так как появляется первая строка с типом 2.Я не был бы привлечен к любой другой строке с Типом 1 - только это:

1  | T-123456 | 5637636 
1  | T-789123 | 5637635 

Квази только эти строки с Типом 1, которые находятся между первой строкой с Типом 5 и первой строкой с Типом 2.

Надеюсь, вы могли бы мне помочь.Большое спасибо.

Крисси

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вы можете попробовать ниже для версии mysql менее 8.0

 select * from
    (SELECT 
        @row_number:=CASE
            WHEN @Type = PType THEN @row_number + 1
            ELSE 1
        END AS num,
        @Type:=Type as PType,
        Type,
        OBID,RECID
    FROM
        tablename order by type,RECID desc
    )X where num in (1,2)

ИЛИ Вы можете использовать row_number () в случае версии mysql 8.0 +

select * from 
(
select *, row_number() over(partition by  type order by recid desc) as rn
from tablename
)X where rn in (1,2)
0 голосов
/ 25 октября 2018

Это похоже на проблему пропусков и островов, но в этом случае вам нужен только один остров.Один из подходов заключается в использовании подзапросов для поиска:

  • Самое высокое значение RECID, где Type=1.Это представляет включительно верхнюю границу острова.
  • Наивысшее значение RECID, где Type!=1, и , где значение RECID также равно меньше , чем указанное выше значение RECID.Это служит исключительной нижней границей острова.

Вот рабочий запрос:

SELECT *
FROM yourTable
WHERE Type = 1 AND RECID > (SELECT MAX(RECID) FROM yourTable
                            WHERE Type <> 1 AND RECID < (SELECT MAX(RECID) FROM yourTable
                                                         WHERE Type = 1)) AND
                   RECID <= (SELECT MAX(RECID) FROM yourTable WHERE Type = 1)
ORDER BY
    RECID DESC;

enter image description here

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...