【问题标题】:How to add a numerical value into a window frame in SQLite?如何在 SQLite 的窗口框架中添加数值?
【发布时间】:2020-06-12 18:59:46
【问题描述】:

我在 SQLite 的 Windows 框架规范中添加数字时遇到了一些困难。我在 SQLITE 中使用 R。虽然如果您知道如何在 SQL 中执行此操作,那么这也很有帮助。

这是一个指向 sqlite 窗口函数文档的链接——尽管我很难理解我应该将数值放在哪里。

https://www.sqlite.org/windowfunctions.html

特别是我正在查看框架边界部分。

我一直收到错误消息:

Error: unsupported frame specification 

有什么想法吗?

我的代码如下:

"create temp table forward_looking as 
              SELECT *,  
        COUNT( CASE channel WHEN 'called_office'  THEN 1 ELSE null END)
        OVER (PARTITION by special_digs 
        ORDER BY time 
        RANGE FOLLOWING 604800) 
      AS new_count
      from my_data
    ")

基本上,代码应该查看unix epoch时间的时间列,然后提前7天(unix时间为604800)然后将计数添加到new_count。并逐行执行此操作。

我想我可能将RANGE FOLLOWING 部分中的数字弄错了??

【问题讨论】:

  • 如果您在链接的文档中查看 frame-spec 的语法图,您使用的是有效的吗?
  • @Shawn 所以我确实查看了框架规范文档,语法图确实很有帮助 - 尝试理解它需要一段时间,但我设法弄明白了!跨度>

标签: sql r sqlite window-functions


【解决方案1】:

我认为你想要:

create temp table forward_looking as 
select 
    d.*,  
    count(*) filter(where channel <> 'called_office') over (
        partition by special_digs 
        order by time 
        range between current row and 604800 following
    ) as new_count
from my_data d

也就是说,range 子句需要一个开始和结束规范 (between ... and ...)。

注意,我还修改了窗口函数,使用标准的filter子句,这样逻辑更明显。

【讨论】:

  • 感谢您的帮助 - 我确实运行了此代码,尽管当我希望计数值出现在通道列的其他值上时,我最终在通道 = '称为办公室' 上出现了计数值而不是在“被叫办公室”的记录中
  • @BeansOnToast:好的,所以我认为只需将 filter 子句中的相等更改为不等即可。查询已更新。
  • 是的,成功地解决了这个问题——我确实在使用 case when 而不是 filter 子句时尝试了这个,它返回了相同的结果,所以我对结果很满意——感谢您的帮助!跨度>
猜你喜欢
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 2012-09-03
相关资源
最近更新 更多