Конечный член последовательности между двумя столбцами таблицы - PullRequest
0 голосов
/ 18 октября 2018

У меня есть таблица, в которой есть в основном три интересующих меня столбца: old_item_id, new_item_id и date_of_change.Я хочу пересмотреть последовательность и узнать последние id некоторых идентификаторов предметов.Пример данных ниже:

old_item_id new_item_id date_of_change
     1            2        2015-01-01
     2            5        2015-01-02
     5            12       2015-10-01
     4            5        2015-01-02
     6            7        2015-02-02

Так что, если мне нужны последние идентификаторы, скажем, пунктов 1, 4, 6 и 8;в таком случае я должен получить вывод:

item_id    latest_item_id 
     1            12               
     4            12        
     6            7
     8            8

, поскольку 1 и 4 можно отследить до 12. Идентификатор элемента 6 был изменен на 7, а идентификатор элемента 8 никогда не изменялся.

В настоящее времяЯ делаю это путем многократного попадания в таблицу в цикле while из другого скрипта.Однако я ищу запрос, чтобы сделать это в одном попадании базы данных.

1 Ответ

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

Это можно сделать с помощью пакета igraph, но это решение теории графов, а не базы данных.

library(igraph)

g <- graph_from_data_frame(dat)
res <- lapply(V(g), function(i) dfs(g, i, unreachable = FALSE)$order)
res <- lapply(res, function(e) e[!is.na(e)])
sapply(res, function(e) names(e)[length(e)])
#   1    2    5    4    6   12    7 
#"12" "12" "12" "12"  "7" "12"  "7"

Обратите внимание, что при необходимости вы можете привести конечный результат к классу integer.

Данные.

dat <-
structure(list(old_item_id = c(1L, 2L, 5L, 4L, 6L), new_item_id = c(2L, 
5L, 12L, 5L, 7L), date_of_change = structure(c(16436, 16437, 
16709, 16437, 16468), class = "Date")), row.names = c(NA, -5L
), class = "data.frame")
...