Пропустить сначала последовательные записи с одинаковыми значениями, затем остановить - PullRequest
0 голосов
/ 30 марта 2020

Это сценарий моей таблицы

+----------+------------+---------------------+------------------+
| userd_id | user_value |    user_datetime    | i_want_to_select |
+----------+------------+---------------------+------------------+
|        1 |          1 | 2020-01-31 12:13:14 |                  |
|        2 |          1 | 2020-01-30 12:13:14 |                  |
|        3 |          1 | 2020-01-29 12:13:14 |                  |
|        4 |          2 | 2020-01-28 12:13:14 |                  |
|        5 |          2 | 2020-01-27 12:13:14 |                  |
|        6 |          3 | 2020-01-20 12:13:14 |                  |
|        7 |          1 | 2020-01-19 12:13:14 | this             |
|        8 |          1 | 2020-01-18 12:13:14 | this             |
|        9 |          1 | 2020-01-17 12:13:14 | this             |
+----------+------------+---------------------+------------------+

Необходимо пропустить эти последовательные значения, только если первый элемент равен 1, и останавливаться как как только значение будет другим

, я делаю это в PHP коде, но я хочу избежать утяжеления процессора PHP и сборщика мусора

foreach ($rows as &$row){
   if($row['user_value'] === 1){
       unset($row); // remove my row
   } else {
      break; // at the first different value, stop
   }
}

unset($row);
$rows = array_values($rows) //reset the array index/key

Спасибо

1 Ответ

1 голос
/ 30 марта 2020

Один из методов:

select t.*
from t
where t.user_datetime >= (select min(t2.user_datetime)
                         from t t2
                         where t2.user_id = t.user_id and
                               t2.user_value <> 1
                        );

Вы также можете использовать оконные функции, например:

select t.*
from (select t.*,
             min( case when t.user_value <> 1 then t user_datetime) over (partition by t.user_id) as min_not1_datetime
      from t
     ) t
where user_datetime >= min_not1_datetime;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...