ОШИБКА 1064 (42000) Ошибка базы данных в синтаксисе избыточного раздела - PullRequest
0 голосов
/ 25 января 2020
mysql> select * from FinalTable;
+------+-------+-------+---------------------+
| id   | name  | state | timestamp           |
+------+-------+-------+---------------------+
|   12 | name1 | TX    | 2020-01-25 11:29:36 |
|   14 | name3 | CA    | 2020-01-25 11:29:36 |
|   14 | name3 | TX    | 2020-01-25 11:29:36 |
|   12 | name1 | CA   | 2020-01-25 11:29:36 |
|   13 | name2 | TA   | 2020-01-25 11:29:36 |
|   14 | name3 |  CA   | 2020-01-25 11:29:36 |
+------+-------+-------+---------------------+

Я смотрю на выходной запрос, который выдает ответ:

I2 name1 TX 2020-01-25 11:29:36  CA 2020-01-25 11:29:36

, когда я запускаю запрос,

select id,name,state,timestamp,
lead(state,1) over (partition by id order by timestamp asc) out_state,
lead(timestamp,1) over (partition by id order by timestamp asc) out_timestamp
from FinalTable

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(partition by id order by timestamp asc) out_state,
lead(timestamp,1) over (part' at line 2

также возможно создать метку времени до миллисекунд а не секунды в БД? Я использую CURRENT_TIMESTAMP.

1 Ответ

1 голос
/ 25 января 2020

Оконные функции (такие как lead()) были добавлены только в MySQL 8.0, поэтому они недоступны в версии 5.7. Вы можете эмулировать lead() с помощью самостоятельного объединения следующим образом:

select t.*, tlead.state, tlead.timestamp
from FinalTable t
left join FinalTable tlead 
    on tlead .id = t.id
    and tlead.timestamp = (
        select min(t1.timestamp) 
        from FinalTable t1 
        where t1.id = t.id and t1.timestamp > t.timestamp
    )

Примечание: для правильной работы этого метода необходимо, чтобы последующие записи того же id имели разные timestamp s - это не относится к показанным вами образцам данных, где все временные метки одинаковы (я полагаю, это опечатка в ваших данных семплов).

...