【问题标题】:SQL Shift Timeseries (Get Following Row For Multiple Timestamps)SQL Shift Timeseries(获取多个时间戳的后续行)
【发布时间】:2021-12-04 16:17:29
【问题描述】:

我有一个如下所示的数据库:

timestamp           | entity_id
--------------------+----------
2021-12-01 10:00:00 | A
2021-12-01 09:00:00 | A
2021-12-01 08:00:01 | A
2021-12-01 08:00:00 | B
2021-12-01 07:00:00 | A

timestampUNIQUE,但我事先不知道不同的时间戳相距多远。我怎样才能写出一个能让我得到以下结果的语句?

entity_id | following_entity_id | count
----------+---------------------+------
A         | A                   | 2
A         | B                   | 1
B         | A                   | 1

当使用 pandas 时,我可能会使用它的 shift 方法,但在这种情况下我需要使用原始 SQL 来执行此操作。

【问题讨论】:

  • 您想要以下还是之前的 entity_id(按时间戳顺序)?此外,您仅发布了 4 行作为示例数据。如果表中后面还有一对 As,这是否也会计入第一行的结果中?
  • 我想要 entity_ids 在整个表格中按时间顺序紧跟实体 - 我是否正确理解了您的问题?另请注意,我的示例数据中的时间戳都相隔 1 小时,在我的真实数据中不一定是这种情况。 PS:我相应地编辑了问题。
  • "2021-12-01 10:00:00 | A" 的 A 是最后一个 entity_id 并且没有后续 entity_id(意味着按时间顺序之后没有任何内容)。 “2021-12-01 08:00:01 | A”的 A 具有“2021-12-01 10:00:00 | A”的 A,如下 entity_id。 "2021-12-01 08:00:00 | B" 的 B 有 "2021-12-01 08:00:01 的 A 作为以下 entity_id 等等。这是你想要的吗?
  • 是的,然后我假设我拍摄 GROUP BY following_entity_idCOUNT(*) 以获得如问题所示的结果。

标签: sql sqlite group-by count window-functions


【解决方案1】:

您需要LAG() 窗口函数来获取前一个(按时间顺序)entity_id 的值(或LEAD() 窗口函数来获取以下值)然后聚合:

SELECT entity_id, following_entity_id, COUNT(*) count
FROM (
  SELECT *, LAG(entity_id) OVER (ORDER BY timestamp) following_entity_id
  FROM tablename       
)
WHERE following_entity_id IS NOT NULL
GROUP BY entity_id, following_entity_id;

请参阅demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2019-12-08
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多