在窗口函数中计算具有相等值的行

Posted

技术标签:

【中文标题】在窗口函数中计算具有相等值的行【英文标题】:Count rows with equal values in a window function 【发布时间】:2020-10-25 14:13:41 【问题描述】:

我在 SQLite 数据库中有一个时间序列并想对其进行分析。

时间序列的重要部分由具有不同但不唯一的字符串值的列组成。 我想做这样的事情:

Value  concat  countValue

A      A       1
A      A,A     1
B      A,A,B   1
B      A,B,B   2
B      B,B,B   3
C      B,B,C   1
B      B,C,B   2

我不知道如何获取 countValue 列。它应该计算分区的所有值等于当前行的值。

我试过了,但它只计算分区中的所有值,而不是等于该行值的值。

SELECT 
    Value,
    group_concat(Value) OVER wind AS concat,
    Sum(Case When Value Like Value Then 1 Else 0 End) OVER wind AS countValue
FROM TimeSeries
WINDOW
    wind AS (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
ORDER BY 
    date
;

查询也受到这些因素的限制:

    查询应该使用任意数量的唯一值 查询应该适用于任何分区大小(行之间的 n 前和当前行)

这甚至可以只使用 SQL 吗?

【问题讨论】:

什么是champions.name 我原来的 SQL 语句的替换错误。 【参考方案1】:

这是一种使用字符串函数的方法:

select 
    value,
    group_concat(value) over wind as concat,
    (
        length(group_concat(value) over wind) - length(replace(group_concat(value) over wind, value, ''))
    ) / length(value) cnt_value
from timeseries
window wind as (order by date rows between 2 preceding and current row)
order by date;

【讨论】:

这可以解决问题,谢谢。我想我明白为什么会这样。它通过计算连接字符串中 Value 字符串的出现次数来工作,对吗?但是有没有办法在窗口函数中引用当前行的值?

以上是关于在窗口函数中计算具有相等值的行的主要内容,如果未能解决你的问题,请参考以下文章

重学SQL窗口函数

窗口函数

HiveSQL核心技能之窗口计算

Spark窗口函数过滤不符合要求的行

Clickhouse:等效于计算当前行之前的行的窗口平均值

针对同一列中的另一个计算窗口函数