首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COUNT()超过在配置单元中使用DISTINCT和WINDOWING的可能性

COUNT()超过在配置单元中使用DISTINCT和WINDOWING的可能性
EN

Stack Overflow用户
提问于 2018-01-23 00:22:34
回答 2查看 2.1K关注 0票数 1

我想要计算当前行和前X行(滑动窗口)之间存在的不同端口号的数量,其中x可以是任意整数。

例如,

如果输入为:

代码语言:javascript
复制
ID      PORT   
1        21
2        22  
3        23
4        25 
5        25
6        21

输出应为:

代码语言:javascript
复制
ID      PORT    COUNT
1        21       1
2        22       2
3        23       3
4        25       4
5        25       4
6        21       4

我正在使用蜂窝,通过RapidMiner,我已经尝试了以下方法:

代码语言:javascript
复制
select id, port,
        count (*) over (partition by srcport order by id rows between 5 preceding and current row)

这必须适用于大数据,并且当X是大整数时。

任何反馈都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2018-01-23 00:29:48

我不认为有一个简单的方法。一种方法是使用lag()

代码语言:javascript
复制
select ( (case when port_5 is not null then 1 else 0 end) +
         (case when port_4 is not null and port_4 not in (port_5) then 1 else 0 end) +
         (case when port_3 is not null and port_3 not in (port_5, port_4) then 1 else 0 end) +
         (case when port_2 is not null and port_2 not in (port_5, port_4, port_3) then 1 else 0 end) +
         (case when port_1 is not null and port_1 not in (port_5, port_4, port_3, port_2) then 1 else 0 end) +
         (case when port is not null and port not in (port_5, port_4, port_3, port_2, port_2) then 1 else 0 end)
       ) as cumulative_distinct_count
from (select t.*,
             lag(port, 5) over (partition by srcport order by id rows) as port_5,
             lag(port, 4) over (partition by srcport order by id rows) as port_4,
             lag(port, 3) over (partition by srcport order by id rows) as port_3,
             lag(port, 2) over (partition by srcport order by id rows) as port_2,
             lag(port, 1) over (partition by srcport order by id rows) as port_1
      from t
     ) t

这是一个复杂的查询,但是性能应该还可以。

注意:我假设portsrcport是一回事,但这是从您的查询中借用的。

票数 0
EN

Stack Overflow用户

发布于 2018-01-23 00:41:49

一种方法是使用self join,因为窗口函数不支持distinct

代码语言:javascript
复制
select t1.id,count(distinct t2.port) as cnt
from tbl t1
join tbl t2 on t1.id-t2.id>=0 and t1.id-t2.id<=5 --change this number per requirements
group by t1.id
order by t1.id

这假设id是按顺序排列的。

如果不是,首先获取行号并使用上面的逻辑。这就像是

代码语言:javascript
复制
with rownums as (select id,port,row_number() over(order by id) as rnum
                 from tbl)
select r1.id,count(distinct r2.port)
from rownums r1
join rownums r2 on r1.rnum-r2.rnum>=0 and r1.rnum-r2.rnum<=5
group by r1.id
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48386041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档