Select 给定一个唯一 ID,只有列从它之前的行更改的行

Select only rows that has a column changed from the rows before it, given an unique ID

我有一个 postgreSQL 数据库,我想在其中记录每个 ID 的特定列随时间的变化情况。表 1:

personID | status | unixtime | column d | column e | column f
    1        2       213214      x            y        z
    1        2       213325      x            y        z
    1        2       213326      x            y        z
    1        2       213327      x            y        z
    1        2       213328      x            y        z
    1        3       214330      x            y        z
    1        3       214331      x            y        z
    1        3       214332      x            y        z
    1        2       324543      x            y        z

我想跟踪一段时间内的所有状态。所以基于此我想要一个新的 table, table2 具有以下数据:

personID | status | unixtime | column d | column e | column f
    1        2       213214      x            y        z
    1        3       214323      x            y        z
    1        2       324543      x            y        z

x、y、z 是可以并且将在每一行之间变化的变量。 tables 有数以千计的其他 personID,我也想捕获这些 ID 不断变化的 ID。按状态、personid 的单个组是不够的(如我所见),因为我可以存储几行相同的状态和 personID,就像状态发生变化一样。

我在 Python 中执行此操作,但速度很慢(我猜它有很多 IO):

for person in personid:
    status = -1
    records = getPersonRecords(person) #sorted by unixtime in query
    newrecords = []
    for record in records:
        if record.status != status:
                 status = record.status
                 newrecords.append(record)
    appendtoDB(newrecords)

这是一个缺口和孤岛问题。您想要每个岛的开始,您可以通过将当前行的状态与 "previous" 记录的状态进行比较来识别。

Window 函数可以派上用场:

select t.*
from (
    select t.*, lag(status) over(partition by personID order by unixtime) lag_status
    from mytable t
) t
where lag_status is null or status <> lag_status