【问题标题】:SQLite Select SUM Rolling WindowSQLite 选择 SUM 滚动窗口
【发布时间】:2021-11-17 06:29:47
【问题描述】:

我在 SQLite 中有这张表

Table [Ticks]
Fields: 2
    [Value]: INT
    [Time]: DATETIME

我想选择一个包含 10 小时值的窗口或分区,并对这些值求和,然后向前移动一行,并在整个记录范围的最后 10 小时内执行相同的操作。

值字段包含-1或1

我怎样才能做到这一点?这可以通过 WINDOW, PARTITION 查询实现吗?

【问题讨论】:

  • Time 列的格式是什么,您的 SQLite 版本是什么?
  • @forpas 它是 DATETIME,SQLite 3.36
  • SQLite 中没有 DATETIME 数据类型:sqlite.org/datatype3.html
  • @forpas 这是来自 DB Browser 的 SQL CREATE 语句,用于 SQLite CREATE TABLE [Ticks]([Value] INT, [Time] DATETIME)
  • 在 CREATE TABLE 语句中使用 SQLite,您可以将任何数据类型用于数据类型,甚至可以不使用任何内容,并且将被允许。试试CREATE TABLE tablename(Time imaginarydatatype)。有用。我的问题是您如何将日期存储在表格中?它是整数(unix 时间)还是浮点数(儒略日)或字符串,如果它们是字符串,它们的格式是什么?

标签: sql sqlite


【解决方案1】:

您可以将time 转换为秒,然后使用range():

select t.*,
       sum(value) over (order by strftime('%s', time) + 0
                        range between 35999 preceding and current row
                       ) as sum_10hours
from ticks t;

strftime() 表达式将值转换为秒。该范围需要 (106060 - 1) 秒之前到当前行。

Here 是一个 db-fiddle。

【讨论】:

  • sum_10hours 包含与值字段 1 或 -1 完全相同的值,它不会对值求和
  • @Mario 。 . .来自strftime() 的字符串结果需要转换为数字,所以我只是在其中添加了0。
  • 现在 sum_10hours 只包含当前行和最后一行的总和,并且每行每 5-10 分钟记录一次,因此 10 小时的总和应该包含大约 100-120 行的总和
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 2018-11-25
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多