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
我有一个 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