【问题标题】:Get distinct values within time chunks在时间块内获取不同的值
【发布时间】:2022-01-20 15:22:08
【问题描述】:

我有一张表格,其中包含来自实地调查的不同物种及其出现次数(时间戳):

species | timestamp
A       | 2021-04-01T12:35
A       | 2021-04-01T12:36
B       | 2021-04-01T12:36
A       | 2021-04-01T12:37
A       | 2021-04-01T12:39
C       | 2021-04-01T12:40
B       | 2021-04-01T12:42
C       | 2021-04-01T12:44
C       | 2021-04-01T12:44
B       | 2021-04-01T12:47

现在我想计算它们,不是总数,而是每个 10 分钟的块,其中只计算第一次出现。 这意味着在 12:31 到 12:40 之间有物种 A、B、C。 12:41 到 12:50 之间有 B、C 种。

对于一个 10 分钟的块,我可以做类似的事情

SELECT DISTINCT(species) 
FROM table
WHERE timestamp IS <condition>

但我需要的是这样的:

chunk_start_time | chunk_end_time   | species 
2021-04-01T12:31 | 2021-04-01T12:40 | A       
2021-04-01T12:31 | 2021-04-01T12:40 | B       
2021-04-01T12:31 | 2021-04-01T12:40 | C       
2021-04-01T12:41 | 2021-04-01T12:50 | B       
2021-04-01T12:41 | 2021-04-01T12:50 | C       

我的时间戳没有秒数。这就是为什么它是 x1 到 x0 分钟的原因。 我如何在 SQLite 中进行数学运算,或者我应该更好地使用 Python pandas 吗?

【问题讨论】:

  • 您的预期结果不包含任何计数。
  • 我对每个物种都计数一次。
  • 这不算数。编辑您的问题并更好地解释您想要什么。
  • 我编辑了题目,问题很清楚。
  • 事实上,每个小时的最后一个块是例如:2021-04-01T12:512021-04-01T13:00。这是正确的吗?

标签: sql sqlite timestamp distinct timespan


【解决方案1】:

使用日期时间函数strftime() 生成块:

SELECT DISTINCT
       strftime(
         '%Y-%m-%dT%H:%M', 
         timestamp, 
         '-' || CASE WHEN timestamp LIKE '%0' THEN 9 ELSE SUBSTR(timestamp, -1) - 1 END || ' minute'
       ) chunk_start_time,
       strftime(
         '%Y-%m-%dT%H:%M', 
         timestamp, 
         '+' || CASE WHEN timestamp LIKE '%0' THEN 0 ELSE 10 - SUBSTR(timestamp, -1) END || ' minute'
       ) chunk_end_time,
       species
FROM tablename
ORDER BY chunk_start_time, species;

请参阅demo

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多