У меня есть входные данные, у которых есть id, pid, pname, ppid, которые являются id (можно подумать, что пришло время), pid (идентификатор процесса), pname (имя процесса), ppid (идентификатор родительского процесса), который создал pid
+---+---+-----+----+
| id|pid|pname|ppid|
+---+---+-----+----+
| 1| 1| 5| -1|
| 2| 1| 7| -1|
| 3| 2| 9| 1|
| 4| 2| 11| 1|
| 5| 3| 5| 1|
| 6| 4| 7| 2|
| 7| 1| 9| 3|
+---+---+-----+----+
теперь нужно найти ppname (имя родительского процесса), которое является последним pname (предыдущими pnames) следующего условия previous.pid == current.ppid
ожидаемый результат для предыдущего примера:
+---+---+-----+----+------+
| id|pid|pname|ppid|ppname|
+---+---+-----+----+------+
| 1| 1| 5| -1| -1|
| 2| 1| 7| -1| -1| no item found above with pid=-1
| 3| 2| 9| 1| 7| last pid = 1(ppid) above, pname=7
| 4| 2| 11| 1| 7|
| 5| 3| 5| 1| 7|
| 6| 4| 7| 2| 11| last pid = 2(ppid) above, pname=11
| 7| 1| 9| 3| 5| last pid = 3(ppid) above, pname=5
+---+---+-----+----+------+
Я могу присоединиться самостоятельно, основываясь на pid==ppid
, затем взять diff между идентификаторами и выбрать строку с минимальной положительной разницей, может быть, затем снова присоединиться для случаев, когда мы не нашли положительных различий (-1 случай).
Но я думаю, что это почти как перекрестное соединение, которое я не мог бы себе позволить, так как у меня 100M рядов.