首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Server:按行分组

Server:按行分组
EN

Stack Overflow用户
提问于 2020-09-10 11:42:24
回答 1查看 48关注 0票数 0

我有如下数据:

我想为相同的访问者将行分组,这些访问者拥有purchase =1,以及他们以前所有的访问,而在那里,purchase = 0。对于上述数据示例,应将行分组为:

  • 第1行和第2行应组合在一起(因为visit_id 1002已购买=1,而visit_id 1001则是采购前的前一次访问,而购买前已购买= 0)
  • 第3行应单独分组(因为visit_id 1003已购买=1,而且以前没有访问visit_id 1003并已购买= 0) (visit_id 1001不能视为visit_id 1003的前一次访问,因为visit_id 1002发生在1001至1003之间,并且它已购买= 1)。
  • 第4行应单独分组(因为visit_id 2001以前没有访问过)
  • 第5行、第6行和第7行应归为一组(因为visit_id 2004拥有Rows =1,而visit_ids 2002和2003年是以前进行的访问,而Rows= 0)

如何才能做到这一点?我正在使用Server 2012。

我预期的产出如下:

生成上述数据的代码:

代码语言:javascript
代码运行次数:0
运行
复制
CREATE TABLE [#tmp_data]
(
    [visitor]       INT, 
    [visit_id]      INT, 
    [visit_time]    DATETIME, 
    [purchase]      BIT
);

INSERT INTO #tmp_data( visitor, visit_id, visit_time, purchase )
VALUES( 1, 1001, '2020-01-01 10:00:00', 0 ), 
( 1, 1002, '2020-01-02 11:00:00', 1 ), 
( 1, 1003, '2020-01-02 14:00:00', 1 ), 
( 2, 2001, '2020-01-01 10:00:00', 1 ), 
( 2, 2002, '2020-01-07 11:00:00', 0 ), 
( 2, 2003, '2020-01-08 14:00:00', 0 ), 
( 2, 2004, '2020-01-11 14:00:00', 1 );
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-10 11:44:23

我不知道你所说的“分组”是什么意思。但是,您对分组的描述是给定值上或之后的1值的数量。因此,这将为每个visitor分配一个值。

代码语言:javascript
代码运行次数:0
运行
复制
select td.*,
       sum(case when purchase = 1 then 1 else 0 end) over (partition by visitor order by visit_time desc) as grouping
from #tmp_data td;

这可以简化为:

代码语言:javascript
代码运行次数:0
运行
复制
select td.*,
       sum( convert(int, purchase) ) over (partition by visitor order by visit_time desc) as grouping
from tmp_data td
order by visitor, visit_time;

注意:这只是分配一个“分组”。在此之后,您可以根据自己的需要进行聚合。

这里是db<>fiddle。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63828952

复制
相关文章

相似问题

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