Sql 基于特定条件的行数
我有一个按sessionid和时间戳ts排序的表 我想找到的是,在同一个会话sessionid中,在购物车页面视图屏幕\u name='checkout\u cart'之后至少有一个listpage视图屏幕\u name='listpage'的sessionid的计数 表:Sql 基于特定条件的行数,sql,sql-server,Sql,Sql Server,我有一个按sessionid和时间戳ts排序的表 我想找到的是,在同一个会话sessionid中,在购物车页面视图屏幕\u name='checkout\u cart'之后至少有一个listpage视图屏幕\u name='listpage'的sessionid的计数 表: sessionid screen_name ts 11 checkout_cart 1593 11 checkout_cart 1594 12 checkout_cart 1890 12 home_page 1892 12
sessionid screen_name ts
11 checkout_cart 1593
11 checkout_cart 1594
12 checkout_cart 1890
12 home_page 1892
12 list_page 1894
12 checkout_cart 1896
13 list_page 1900
13 checkout_cart 1902
13 home_page 1904
14 checkout_cart 1990
14 home_page 1992
14 list_page 1994
14 checkout_cart 1996
根据表格,我的计数应该是2会话id 12和14,13不能计数,因为列表页面在购物车页面之前
请帮我写一个关于这个的查询,我被逻辑卡住了。试试这个版本:
select t.sessionid,count(*)
from your_table t
where screen_name='listpage'
and exists
(
select 1
from your_table t2
where t2.screen_name='checkout_cart'
and t2.ts<t.ts and t.sessionid=t2.sessionid
)
group by t.sessionid
编辑:添加了sessionid加入条件,最初错过了该条件请尝试此现有版本:
select t.sessionid,count(*)
from your_table t
where screen_name='listpage'
and exists
(
select 1
from your_table t2
where t2.screen_name='checkout_cart'
and t2.ts<t.ts and t.sessionid=t2.sessionid
)
group by t.sessionid
编辑:添加了sessionid连接条件,错过了最初一个使用聚合的方法。要获取会话列表,请执行以下操作:
select sessionid
from t
where screen_name in ('listpage', 'checkout_cart') -- only needed for performance
group by sessionid
having max(case when screen_name = 'listpage' then ts end) > min(case when screen_name = 'checkout_cart' then ts end)
要获取计数,请使用子查询或CTE:
select count(*)
from (select sessionid
from t
where screen_name in ('listpage', 'checkout_cart') -- only needed for performance
group by sessionid
having max(case when screen_name = 'listpage' then ts end) > min(case when screen_name = 'checkout_cart' then ts end)
) t
一种方法使用聚合。要获取会话列表,请执行以下操作:
select sessionid
from t
where screen_name in ('listpage', 'checkout_cart') -- only needed for performance
group by sessionid
having max(case when screen_name = 'listpage' then ts end) > min(case when screen_name = 'checkout_cart' then ts end)
要获取计数,请使用子查询或CTE:
select count(*)
from (select sessionid
from t
where screen_name in ('listpage', 'checkout_cart') -- only needed for performance
group by sessionid
having max(case when screen_name = 'listpage' then ts end) > min(case when screen_name = 'checkout_cart' then ts end)
) t
。。。有了它,您也不需要执行子查询。它是一个带有case语句的简单聚合
。。。有了它,您也不需要执行子查询。这是一个带有case语句的简单聚合。或多或少,这个查询是可以的。或多或少,这个查询是可以的。谢谢它工作了,而不是我用min的max签出购物车。谢谢它工作了,而不是我用min的max签出购物车。